在这篇文章中,我描述了寻找numpy数组的规范。数组的规范是一个将数组映射为非负实数的函数。为了找到一个numpy数组的规范,我们使用numpy的numpy.linalg.norm方法。该方法接收一个数组或类似数组的对象(例如:Python的列表)作为输入,并返回一个浮点数或规范值的数组。
让我们看一个例子。
$ python3
Python 3.8.5 (default, Mar 8 2021, 13:02:45)
[GCC 9.3.0] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import numpy as np
>>> a = np.linspace(-4, 4, 9)
>>> a
array([-4., -3., -2., -1., 0., 1., 2., 3., 4.])
>>> np.linalg.norm(a)
7.745966692414834

numpy计算的默认规范是L2规范,也被称为欧几里得规范。规范的顺序可以通过提供给numpy.linalg.norm的ord参数来指定。继续上面的内容。
>>> np.linalg.norm(a, ord=1)
20.0

上面的语句计算了规范1。Norm 1只是数组的绝对值之和。一般来说,任何阶数ord的向量的规范计算方法是
(∑i | x |ord )1/ord

其中,求和是对数组中每个元素的绝对值进行的。人们可以绕过np.inf这个命令来计算无穷大规范。规范无穷大是数组中所有元素的最大绝对值。
>>> np.linalg.norm(a, ord=np.inf)
4.0

假设我们有一个矩阵,应该计算它的规范。
>>> a = np.linspace(-4, 4, 9).reshape(3, 3)
>>> a
array([[-4., -3., -2.],
[-1., 0., 1.],
[ 2., 3., 4.]])
>>> np.linalg.norm(a)
7.745966692414834

上面返回的是在整个矩阵中计算的欧几里得规范。但是在有些情况下,我们需要计算某个特定轴的规范。NumPy也允许使用参数axis来指定一个轴,以计算矩阵的规范。通过使用参数axis,我们可以指定计算规范的坐标轴。轴0是第一维。继续前面的例子,如果我们指定axis=0,就会计算横跨行的法线,而指定axis=1就会计算横跨列的法线。
>>> a
array([[-4., -3., -2.],
[-1., 0., 1.],
[ 2., 3., 4.]])
>>> np.linalg.norm(a, axis=0)
array([4.58257569, 4.24264069, 4.58257569])
>>> np.linalg.norm(a, axis=1)
array([5.38516481, 1.41421356, 5.38516481])

如果它是一个多维矩阵,可以将一个整数的元组传递给axis参数,该元组指定了要计算规范的轴。
>>> a = np.linspace(1, 8, 8).reshape(2, 2, 2)
>>> a
array([[[1., 2.],
[3., 4.]],
[[5., 6.],
[7., 8.]]])
>>> np.linalg.norm(a, axis=(1, 2))
array([ 5.47722558, 13.19090596])
>>> a[0,:,:]
array([[1., 2.],
[3., 4.]])
>>> np.linalg.norm(a[0,:,:])
5.477225575051661
>>> a[1,:,:]
array([[5., 6.],
[7., 8.]])
>>> np.linalg.norm(a[1,:,:])
13.19090595827292

在上面的例子中,当我们指定axis=(1,2)时,规范是在轴1和轴2上对轴0中的每个子阵列进行计算。