numpy.linalg.norm

原文:https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.norm.html

译者:飞龙 UsyiyiCN

校对:(虚位以待)

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

矩阵或向量范数。

此函数能够返回八个不同矩阵范数中的一个,或者根据ord参数的值返回无限数量的矢量范数(如下所述)。

参数:

x:array_like

输入数组。如果axis为None,则x必须是1-D或2-D。

ord:{非零int,inf,-inf,'fro','nuc'},可选

规范的顺序(见Notes下的表格)。inf表示numpy的inf对象。

axis:{int,ints的2元组,无},可选

如果axis是整数,则它指定x的轴,沿此轴计算矢量范数。如果axis是2元组,它指定保存2-D矩阵的轴,并计算这些矩阵的矩阵范数。如果axis是None,则向量范数(当x是1-D时)或矩阵范数(当x是2-D时)返回。

keepdims:bool,可选

如果设置为True,则规范化的轴将作为尺寸为1的尺寸留在结果中。使用此选项,结果将相对于原始x正确广播。

版本1.10.0中的新功能。

返回:

n:float或ndarray

矩阵或向量的范数。

笔记

对于ord 0的值,严格来说,结果不是数学“ ,但它仍然可用于各种数值目的。

可以计算以下规范:

ord 矩阵的范数 向量的范数
没有 Frobenius范数 2范数
'fro' Frobenius范数 - -
'nuc' 核准则 - -
inf max(sum(abs(x),axis = 1)) max(abs(x))
-inf min(sum(abs(x),axis = 1)) min(abs(x))
0 - - sum(x!= 0)
1 max(sum(abs(x),axis = 0)) 如下
-1 min(sum(abs(x),axis = 0)) 如下
2 2范数(最大唱。值) 如下
-2 最小奇异值 如下
其他 - - sum(abs(x)** ord)**(1.ord)

Frobenius范数由[R41]给出:

核规范是奇异值的总和。

参考文献

[R41]12 GH Golub and CF Van Loan,Matrix Computations,Baltimore,MD,Johns Hopkins University Press,1985,15

例子

>>> from numpy import linalg as LA
>>> a = np.arange(9) - 4
>>> a
array([-4, -3, -2, -1,  0,  1,  2,  3,  4])
>>> b = a.reshape((3, 3))
>>> b
array([[-4, -3, -2],
       [-1,  0,  1],
       [ 2,  3,  4]])
>>> LA.norm(a)
7.745966692414834
>>> LA.norm(b)
7.745966692414834
>>> LA.norm(b, 'fro')
7.745966692414834
>>> LA.norm(a, np.inf)
4.0
>>> LA.norm(b, np.inf)
9.0
>>> LA.norm(a, -np.inf)
0.0
>>> LA.norm(b, -np.inf)
2.0
>>> LA.norm(a, 1)
20.0
>>> LA.norm(b, 1)
7.0
>>> LA.norm(a, -1)
-4.6566128774142013e-010
>>> LA.norm(b, -1)
6.0
>>> LA.norm(a, 2)
7.745966692414834
>>> LA.norm(b, 2)
7.3484692283495345
>>> LA.norm(a, -2)
nan
>>> LA.norm(b, -2)
1.8570331885190563e-016
>>> LA.norm(a, 3)
5.8480354764257312
>>> LA.norm(a, -3)
nan

使用参数计算向量规范:

>>> c = np.array([[ 1, 2, 3],
...               [-1, 1, 4]])
>>> LA.norm(c, axis=0)
array([ 1.41421356,  2.23606798,  5.        ])
>>> LA.norm(c, axis=1)
array([ 3.74165739,  4.24264069])
>>> LA.norm(c, ord=1, axis=1)
array([ 6.,  6.])

使用参数计算矩阵范数:

>>> m = np.arange(8).reshape(2,2,2)
>>> LA.norm(m, axis=(1,2))
array([  3.74165739,  11.22497216])
>>> LA.norm(m[0, :, :]), LA.norm(m[1, :, :])
(3.7416573867739413, 11.224972160321824)