numpy.linalg.norm

numpy.linalg.norm(x, ord=None, axis=None, keepdims=False)

Функция linalg.norm() вычисляет норму матрицы.

В зависимости от параметра ord данная функция может возвращать одну из восьми норм или одну из бесконечного числа векторыных норм.

Параметры:
x - массив NumPy или подобный массиву объект.
Входной массив. Если axis = None, то это должен быть либо одномерный либо двумерный массив.
ord - {non-zero int, np.inf, -np.inf, ‘fro’, ‘nuc’} (необязательный параметр.

Определяет порядок нормы.

  • ord = None - для матриц возвращается норма Фробениуса, для векторов соответствует ord = 2 (установлен по умолчанию);
  • ord = ‘fro’ - для матриц возвращается норма Фробениуса, для векторов норма не определена;
  • ord = ‘nuc’ - для матриц возвращается ядерная норма (еще называют следовой нормой или 'n'-нормой Кея Фана), которая равна сумме сингулярных значений исходной матрицы, для векторов не определена;
  • ord = inf - для матриц возвращается np.max(np.sum(np.abs(x), axis=1)), для векторов возвращается np.max(np.abs(x));
  • ord = -inf - для матриц возвращается np.min(np.sum(np.abs(x), axis=1)), для векторов возвращается np.min(np.abs(x));
  • ord = 0 - для матриц не определена, для векторов возвращается количество ненулевых элементов (np.sum(x != 0));
  • ord = 1 - для матриц возвращается np.max(np.sum(np.abs(x), axis=0)), для векторов возвращается np.sum(np.abs(x));
  • ord = -1 - для матриц возвращается np.min(np.sum(np.abs(x), axis=0)), для векторов возвращается 1/np.sum(1/np.abs(c)) (np.sum(np.abs(c)**(-1.))**(-1.));
  • ord = 2 - для матриц возвращается наибольшее сингулярное значение исходной матрицы, для векторов возвращается np.sum(np.abs(x)**2)**(1./2);
  • ord = -2 - для матриц возвращается наименьшее сингулярное значение исходной матрицы, для векторов возвращается np.sum(np.abs(x)**(-2))**(-1./2);
  • ord = int - для матриц для векторов возвращается np.sum(np.abs(x)**int)**(1./int).
axis - {int, 2-tuple of ints, None} (необязательный параметр.
Если это одно целое число, то оно указывает ось вдоль которой вычисляются векторные нормы. Если это кортеж из двух целых чисел, то он определяет две оси исходного массива, относительно которых выделяются его подматрицы. Если None, то возвращается норма либо вектора, либо матрицы.
keepdims - True или False (необязательный параметр).
Если данный параметр указан как True, то результат работы функции по указанным осям будет способен к транслированию по исходному массиву, т.е. результат функции оформляется в массив с количеством осей исходного массива. Если параметр установлен в значение False, то результатом работы функции будет либо число, либо одномерный массив чисел.
Возвращает:
результат - массив NumPy или число
Произведение Кронекера указанных массивов.

Замечание

По определению, для ord <= 0 норма для матриц и векторов не определена, тем не менее, функция может вернуть значения, которые хоть и не являются нормой, но могут быть позезны в специальных алгоритмах численных вычислений и анализе.

Смотрите так же:
cond, svd

Примеры

>>> import numpy as np
>>> from numpy import linalg as LA
>>> 
>>> a = np.array([[1, 2, 3], [4, 5, 6]])
>>> b = np.array([0, 2, 3, 4, 5, 7])
>>> 
>>> 
>>> #  ord = None (установлен по умолчанию):
... LA.norm(a)
9.539392014169456
>>> 
>>> LA.norm(b)
10.14889156509222
>>> 
>>> 
>>> #  ord = 'fro' (не определена для векторов):
... LA.norm(a, ord = 'fro')
9.539392014169456
>>> 
>>>
>>> #  ord = 'nuc' (не определена для векторов):
... LA.norm(a, ord = 'nuc')
10.280901636369206
>>> 
>>> #  ядерная норма равна сумме 
... #  сингулярных значений матрицы:
... LA.svd(a, compute_uv = False)
array([9.508032  , 0.77286964])
>>> np.sum(LA.svd(a, compute_uv = False))
10.280901636369206
>>> 
>>> 
>>> #  ord = inf:
... LA.norm(a, ord = np.inf)
15.0
>>> 
>>> LA.norm(b, ord = np.inf)
7.0
>>> 
>>> 
>>> #  ord = -inf:
... LA.norm(a, ord = -np.inf)
6.0
>>> 
>>> LA.norm(b, ord = -np.inf)
0.0
>>> 
>>> 
>>> #  ord = 0 (для матриц не определена):
... LA.norm(b, ord = 0)
5.0
>>> 
>>> 
>>> #  ord = 1:
... LA.norm(a, ord = 1)
9.0
>>> 
>>> LA.norm(b, ord = 1)
21.0
>>> 
>>> 
>>> #  ord = -1:
... LA.norm(a, ord = -1)
5.0
>>> 
>>> LA.norm(b, ord = -1)
0.0
>>> 
>>> 
>>> #  ord = 2:
... LA.norm(a, ord = 2)
9.508032000695723
>>> 
>>> LA.norm(b, ord = 2)
10.14889156509222
>>> 
>>> 
>>> #  ord = -2:
... LA.norm(a, ord = -2)
0.7728696356734839
>>> 
>>> LA.norm(b, ord = -2)
RuntimeWarning: divide by zero encountered in power absx **= ord
0.0
>>> 
>>> 
>>> #  ord = 5 (для матриц не определена):
... LA.norm(b, ord = 5)
7.3348981891009535

Параметр axis позволяет указывать оси по которым вычисляются нормы векторов:

>>> a
array([[1, 2, 3],
       [4, 5, 6]])
>>> 
>>> LA.norm(a, ord = 0, axis = 0)
array([2., 2., 2.])
>>> 
>>> LA.norm(a, ord = 0, axis = 1)
array([3., 3.])

В случае многомерных массивов, параметр axis позволяет указывать подматрицы в виде кортежа из двух целых чисел:

>>> c = np.random.randint(0, 2, size = (3, 2, 4))
>>> c
array([[[0, 1, 1, 1],
        [1, 0, 0, 1]],

       [[1, 1, 0, 0],
        [0, 1, 0, 0]],

       [[1, 1, 0, 0],
        [0, 1, 1, 0]]])
>>> 
>>> LA.norm(c, axis = (0, 1))
array([1.73205081, 2.23606798, 1.41421356, 1.41421356])
>>> 
>>> LA.norm(c, axis = (0, 2))
array([2.64575131, 2.23606798])
>>> 
>>> LA.norm(c, axis = (1, 2))
array([2.23606798, 1.73205081, 2.        ])

Параметр keepdims определяет сохранность количества осей исходного массива, что в дальнейшем позволяет использовать в расчетах механизм транслирования :

>>> LA.norm(c, axis = (0, 1), keepdims = True)
array([[[1.73205081, 2.23606798, 1.41421356, 1.41421356]]])
>>> 
>>> c*LA.norm(c, axis = (0, 1), keepdims = True)
array([[[0.        , 2.23606798, 1.41421356, 1.41421356],
        [1.73205081, 0.        , 0.        , 1.41421356]],

       [[1.73205081, 2.23606798, 0.        , 0.        ],
        [0.        , 2.23606798, 0.        , 0.        ]],

       [[1.73205081, 2.23606798, 0.        , 0.        ],
        [0.        , 2.23606798, 1.41421356, 0.        ]]])