Построение норм L0 и Inf с помощью Contour, Contour

Я пытаюсь построить разные нормы с помощью контура и контура. У меня получилось со всеми нормами, кроме нулевой нормы и инф-нормы. Как правильно построить подобные графики для 0-нормы и инф-нормы?

Вот мой код:

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

Мой код и графики


person maril    schedule 10.02.2018    source источник


Ответы (1)


Во-первых, позвольте мне упомянуть, что numpy предоставляет numpy.linalg.norm что может упростить задачу при расчете норм. В остальном я буду придерживаться попытки из вопроса вычислить норму вручную.

L∞ норма

Норма L∞ будет супремумом двух массивов. Это можно легко рассчитать с помощью numpy.maximum.

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

L0 "норма"

«Норма» L0 будет определяться как количество ненулевых элементов. Следовательно, для двумерного случая он может принимать значения 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()

введите здесь описание изображения

person ImportanceOfBeingErnest    schedule 10.02.2018