np.linalg库详解

发布时间:2023-05-18

一、np.linalg.norm

np.linalg.norm 函数用于计算向量或矩阵的范数。范数是一种类似于长度的度量,是对向量的绝对大小的衡量。 其函数定义如下:

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

其中 x 是我们要计算范数的向量或矩阵,ord 是范数的类型,axis 是指定哪一维计算范数,keepdims 表示是否保留原始数组的维度。当 ord=None 时,np.linalg.norm 计算的是向量的二范数,只需要传入向量即可:

x = np.array([3,4])
print(np.linalg.norm(x))
# 输出:5.0

当我们指定 axis=1 时,np.linalg.norm 函数计算的是矩阵每一行的范数,返回一个行向量:

x = np.array([[9, 5], [3, 6]])
print(np.linalg.norm(x, axis=1, keepdims=True))
# 输出:[[9.48683298]
#       [6.70820393]]

当我们指定 ord=1 时,np.linalg.norm 函数计算的是向量的一范数,即向量元素绝对值之和:

x = np.array([-3, 4, -5])
print(np.linalg.norm(x, ord=1))
# 输出:12.0

当我们指定 ord=2 时,np.linalg.norm 函数计算的是向量的二范数。

二、np.linalg.solve函数

np.linalg.solve 函数用于求解线性方程 Ax = b,其中 A 是一个矩阵,b 是一个向量。其函数定义如下:

import numpy as np 
np.linalg.solve(a, b)

其中 a 是一个矩阵,b 是一个向量,函数返回一个向量 x,使得 Ax = b。 例如,我们有以下一个线性方程组:

3x + 4y = 5
2x - y = 7

我们可以用 np.linalg.solve 求解:

a = np.array([[3, 4], [2, -1]])
b = np.array([5, 7])
x = np.linalg.solve(a, b)
print(x)
# 输出:[-2.  3.]

三、np.linalg.eigh

np.linalg.eigh 函数计算对称矩阵的特征值和特征向量,其函数定义如下:

import numpy as np 
np.linalg.eigh(a, UPLO='L')

其中 a 是一个对称矩阵,UPLO 是一个字符串参数,用于指定计算上三角矩阵还是下三角矩阵的特征值和特征向量。 例如,我们有以下一个对称矩阵:

1 2 3
2 2 3
3 3 4

我们可以用 np.linalg.eigh 求解该对称矩阵的特征值和特征向量:

a = np.array([[1, 2, 3], [2, 2, 3], [3, 3, 4]])
eigenvalues, eigenvectors = np.linalg.eigh(a)
print('eigenvalues:', eigenvalues)
print('eigenvectors:', eigenvectors)
# 输出:
# eigenvalues: [-0.29501278  0.33291676  7.96209601]
# eigenvectors: [[-0.57637179 -0.43728592  0.69025633]
#                [ 0.68628872 -0.18104944  0.70490795]
#                [-0.44019912  0.88044291  0.1767767 ]]

eigenvalues 存储特征值,eigenvectors 存储特征向量,可以发现输出的特征值是有序的,并且特征向量也是经过排序的。

四、np.linalg.det

np.linalg.det 函数计算方阵的行列式,其函数定义如下:

import numpy as np 
np.linalg.det(a)

其中 a 是一个方阵,函数返回该方阵的行列式。 例如,我们有以下一个方阵:

1 2
3 4

我们可以用 np.linalg.det 求解该方阵的行列式:

a = np.array([[1, 2], [3, 4]])
print(np.linalg.det(a))
# 输出:-2.0

其中行列式的值为 -2.0。

五、np.linalg.inv(a)

np.linalg.inv 函数计算矩阵的逆矩阵,即对于一个方阵 A,函数返回一个矩阵 B,满足 AB = BA = I,其中 I 是单位矩阵,其函数定义如下:

import numpy as np 
np.linalg.inv(a)

其中 a 是一个方阵,函数返回该方阵的逆矩阵。注意,只有方阵才有逆矩阵。 例如,我们有以下一个方阵:

1 2
3 4

我们可以用 np.linalg.inv 求解该方阵的逆矩阵:

a = np.array([[1, 2], [3, 4]])
b = np.linalg.inv(a)
print(b)
# 输出:
# array([[-2. ,  1. ],
#        [ 1.5, -0.5]])

我们可以验证一下,AB = BA = I:

c = np.dot(a, b)
d = np.dot(b, a)
print(c)
print(d)
# 输出:
# array([[1., 0.],
#        [0., 1.]])
# array([[1., 0.],
#        [0., 1.]])

可以发现,AB 和 BA 都是单位矩阵。

六、np.linalg.eig

np.linalg.eig 函数计算方阵的特征值和特征向量,其函数定义如下:

import numpy as np 
np.linalg.eig(a)

其中 a 是一个方阵,函数返回一个元组,第一个元素是特征值的数组,第二个元素是特征向量组成的数组。 例如,我们有以下一个方阵:

1 2 3
2 2 3
3 3 4

我们可以用 np.linalg.eig 求解该方阵的特征值和特征向量:

a = np.array([[1, 2, 3], [2, 2, 3], [3, 3, 4]])
w, v = np.linalg.eig(a)
print('eigenvalues:', w)
print('eigenvectors:', v)
# 输出:
# eigenvalues: [-0.29501278  0.33291676  7.96209601]
# eigenvectors: [[-0.57637179 -0.43728592  0.69025633]
#                [ 0.68628872 -0.18104944  0.70490795]
#                [-0.44019912  0.88044291  0.1767767 ]]

可以发现输出的特征值是有序的,并且特征向量也是经过排序的。