【问题标题】:L0 and Inf Norms plotting with Contour, Contourf使用 Contour、Contourf 绘制 L0 和 Inf 范数
【发布时间】:2018-02-11 07:01:23
【问题描述】:

我正在尝试使用轮廓和轮廓绘制不同的规范。除了零范数和 inf 范数之外,我已经成功地使用了所有范数。 为 0-norm 和 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

【问题讨论】:

    标签: python matplotlib contour contourf norm


    【解决方案1】:

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

    L∞范数

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

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

    L0“标准”

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多