我正在尝试用轮廓f和轮廓绘制不同的规范。除了零范数和 inf-范数之外,我已经成功地完成了所有范数。 为 0-范数和 inf-范数绘制相似图的正确方法是什么?
这是我的代码:
`p_values = [0., 0.04, 0.5, 1, 1.5, 2, 7, np.inf]
xx, yy = np.meshgrid(np.linspace(-3, 3, num=101), np.linspace(-3, 3, num=101))
fig, axes = plt.subplots(ncols=(len(p_values) + 1)// 2,
nrows=2, figsize=(14, 7))
for p, ax in zip(p_values, axes.flat):
if p != 0:
zz = ((np.abs((xx))**p) + (np.abs((yy))**p))**(1./p)
else:
zz = np.full_like(xx, np.sum(xx !=0))
ax.contourf(xx, yy, zz, 30, cmap='bwr')
ax.contour(xx,yy,zz, [1], colors='red', linewidths = 2)
proxy = [plt.Rectangle((0,0),1,1, facecolor='red')]
plt.show()`
numpy.linalg.norm
,它可以在计算范数时简化事情。在剩下的时间里,我将坚持尝试从问题中手动计算范数。
L∞范数是两个数组的上等值。这可以使用
numpy.maximum
轻松计算。
zz = np.maximum(np.abs(xx),np.abs(yy))
L0“范数”将被定义为非零元素的数量。对于 2D 情况,它可以取值 0(均为零)、1(一个零)或 2(均非零)。将此函数描述为等高线图并不真正成功,因为该函数本质上仅沿着图中的两条线偏离 2。不过,使用
imshow
绘图可以显示它。
zz = (xx != 0).astype(int) + (yy != 0).astype(int)
ax.imshow(zz, cmap='bwr', aspect="auto")
总的来说,情节可能是这样的
import matplotlib.pyplot as plt
import numpy as np
p_values = [0., 0.04, 0.5, 1, 1.5, 2, 7, np.inf]
xx, yy = np.meshgrid(np.linspace(-3, 3, num=101), np.linspace(-3, 3, num=101))
fig, axes = plt.subplots(ncols=(len(p_values) + 1)// 2,
nrows=2, figsize=(14, 7))
for p, ax in zip(p_values, axes.flat):
if p == 0:
zz = (xx != 0).astype(int) + (yy != 0).astype(int)
ax.imshow(zz, cmap='bwr', extent=(xx.min(),xx.max(),yy.min(),yy.max()), aspect="auto")
else:
if np.isinf(p):
zz = np.maximum(np.abs(xx),np.abs(yy))
else:
zz = ((np.abs((xx))**p) + (np.abs((yy))**p))**(1./p)
ax.contourf(xx, yy, zz, 30, cmap='bwr')
ax.contour(xx,yy,zz, [1], colors='red', linewidths = 2)
plt.show()
numpy.linalg.norm
和美丽的乳胶图例
p_values = [0., 0.04, 0.5, 1, 1.5, 2, 7, np.inf]
xx, yy = np.meshgrid(np.linspace(-3, 3, num=101),
np.linspace(-3, 3, num=101))
fig, axes = plt.subplots(ncols=(len(p_values) + 1)// 2,
nrows=2, figsize=(16, 7))
for p, ax in zip(p_values, axes.flat):
h = np.linalg.norm([xx, yy], ord=p, axis=0)
ax.contourf(xx, yy, h, 20, cmap='coolwarm')
ax.contour(xx, yy, h, [1], colors='#fd02d5')
ax.legend([mlines.Line2D([], [], color="#fd02d5")], [f"$x: \|x\|_{{{p}}}=1$",])
plt.show()