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
норма для матриц и векторов не определена, тем не менее, функция может вернуть значения, которые хоть и не являются нормой, но могут быть позезны в специальных алгоритмах численных вычислений и анализе.
Примеры
>>> 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. ]]])