如何用NumPy查找数组的规范

191 阅读2分钟

在这篇文章中,我描述了寻找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中的每个子阵列进行计算。