L0和Inf规范用Contour,Contourf绘图

时间:2018-02-10 17:18:30

标签: python matplotlib contour contourf norm

我试图用contourf和contour绘制不同的规范。除了零范数和非常规之外,我已经成功地完成了所有规范。 为0范数和inf-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=(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()`

My code and graphs

1 个答案:

答案 0 :(得分:0)

首先,让我提一下numpy提供numpy.linalg.norm,它可以在计算规范时简化事情。在其余部分,我将坚持尝试从问题中手动计算规范。

L∞范数

L∞范数将是两个数组的suppremum。这可以使用numpy.maximum轻松计算。

zz = np.maximum(np.abs(xx),np.abs(yy))

L0“norm”

L0“范数”将被定义为非零元素的数量。对于2D情况,它因此可以取值0(均为零),1(一个零)或2(均为非零)。将此函数描绘为等高线图并不是真正成功,因为该函数基本上仅沿着图中的两条线偏离2。使用imshow图表会显示它。

zz = (xx != 0).astype(int) + (yy != 0).astype(int)
ax.imshow(zz, cmap='bwr', aspect="auto")

enter image description here

完整的例子。

总的来说情节可能看起来像

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()

enter image description here