在线性代数、科学计算以及机器学习中,经常需要进行矩阵乘法、求解线性方程组、矩阵分解以及向量与矩阵范数计算等操作。NumPy 提供了一组线性代数函数,主要集中在 numpy.linalg 模块中,用于完成这些运算。
这些函数采用高度向量化实现,并调用底层高性能数学库(如 BLAS 与 LAPACK),能够高效处理向量与矩阵计算任务。
按照功能划分,NumPy 中常用的线性代数函数通常可以分为以下几类:
(1)矩阵与向量乘法及幂运算
(2)矩阵分解
(3)线性方程组求解
(4)矩阵特征值与特征向量
(5)矩阵范数与条件数
(6)矩阵逆与伪逆
(7)矩阵行列式与秩
一、矩阵与向量乘法及幂运算
matmul()
用于执行矩阵乘法运算(Matrix Multiplication)。与 Python 的 @ 运算符等价。
css
numpy.matmul(a, b)
参数说明:
• a:输入数组或矩阵
• b:输入数组或矩阵
函数行为说明:
当输入为高维数组时,matmul() 会对最后两个维度执行矩阵乘法,其余维度作为批处理维度。
示例:
cs
A = np.array([[1, 2], [3, 4]])
B = np.array([[5, 6], [7, 8]])
np.matmul(A, B)# [[19 22]# [43 50]]
等价写法:
css
A @ B
dot()
计算向量点积或矩阵乘法(Dot Product)。
css
numpy.dot(a, b)
函数行为说明:
• 对一维数组执行向量点积
• 对二维数组执行矩阵乘法
• 对更高维数组按照最后一维与倒数第二维进行乘法运算
参数说明:
• a:输入数组或矩阵
• b:输入数组或矩阵
示例 1:向量点积
apache
import numpy as np
a = np.array([1, 2, 3])b = np.array([4, 5, 6])
np.dot(a, b)# 32
解释:
apache
1×4 + 2×5 + 3×6 = 32
示例 2:矩阵乘法
cs
A = np.array([[1, 2], [3, 4]])
B = np.array([[5, 6], [7, 8]])
np.dot(A, B)# [[19 22]# [43 50]]
说明:
在二维矩阵场景下,dot() 与 matmul() 的结果通常一致;但在更高维数组上,两者的广播与乘法语义并不完全相同,实际使用中通常更推荐使用 matmul() 或 @ 表达矩阵乘法。
multi_dot()
计算多个矩阵的连乘,并自动选择较优的乘法顺序。
go
numpy.linalg.multi_dot(arrays)
参数说明:
• arrays:由多个数组组成的序列
示例:
cs
A = np.array([[1, 2], [3, 4]])
B = np.array([[5, 6], [7, 8]])
C = np.array([[1], [2]])
np.linalg.multi_dot([A, B, C])# [[ 63]# [143]]
该运算等价于:
css
(A @ B) @ C
说明:
multi_dot() 会自动选择更高效的矩阵乘法顺序,特别适用于多个矩阵连乘的场景。
matrix_power()
计算方阵的整数次幂(Matrix Power)。
css
numpy.linalg.matrix_power(a, n)
参数说明:
• a:输入方阵
• n:整数幂,可以为正整数、负整数或 0
返回:
a 的 n 次幂,结果形状与原矩阵相同。
函数行为说明:
• 当 n > 0 时,计算 a 的正整数次幂
• 当 n = 0 时,返回与 a 同形状的单位矩阵
• 当 n < 0 时,先计算 a 的逆矩阵,再求其 |n| 次幂
• 若 a 不是方阵,或 n < 0 且矩阵不可逆,则会报错
示例 1:
cs
A = np.array([[1, 2], [3, 4]])
np.linalg.matrix_power(A, 2)# [[ 7 10]# [15 22]]
示例 2:
cs
A = np.array([[1, 2], [3, 4]])
np.linalg.matrix_power(A, 0)# [[1 0]# [0 1]]
示例 3:
cs
A = np.array([[1, 2], [3, 4]])
np.linalg.matrix_power(A, -1)# 等价于 np.linalg.inv(A)
说明:
matrix_power() 适用于状态转移矩阵、递推关系、图路径计数等问题。它计算的是矩阵乘法意义下的幂,不是元素逐个求幂;若需要逐元素幂运算,应使用 ** 或 np.power()。
二、矩阵分解
svd()
奇异值分解(Singular Value Decomposition)。
完整形式:
python
numpy.linalg.svd(a, full_matrices=True, compute_uv=True)
常用形式:
css
numpy.linalg.svd(a)
参数说明:
• a:输入矩阵
返回:
go
U, S, Vt
其中:
• U:左奇异向量矩阵
• S:奇异值数组
• Vt:右奇异向量矩阵的转置
示例:
cs
A = np.array([[1, 2], [3, 4]])
U, S, Vt = np.linalg.svd(A)
奇异值分解广泛应用于:
• 主成分分析(PCA)
• 降维
• 矩阵近似
svdvals()
计算矩阵的奇异值,但不返回奇异向量。
css
numpy.linalg.svdvals(a)
参数说明:
• a:输入矩阵
示例:
cs
A = np.array([[1, 2], [3, 4]])
np.linalg.svdvals(A)
说明:
若只需要奇异值而不需要奇异向量,可直接使用该函数。
qr()
QR 分解。
perl
numpy.linalg.qr(a)
参数说明:
• a:输入矩阵
返回:
css
Q, R
其中:
• Q:正交矩阵
• R:上三角矩阵
示例:
perl
A = np.array([[1, 2], [3, 4]])
Q, R = np.linalg.qr(A)
说明:
QR 分解常用于最小二乘问题以及数值稳定的线性方程求解。
cholesky()
Cholesky 分解。
css
numpy.linalg.cholesky(a)
参数说明:
• a:输入方阵,必须是对称正定矩阵
返回:
go
L
满足:
ini
A = L @ L.T
示例:
ini
A = np.array([[4, 2], [2, 3]])
L = np.linalg.cholesky(A)
Cholesky 分解常用于:
• 协方差矩阵分解
• 数值优化
• 高效求解线性方程组
三、线性方程组求解
solve()
用于求解满秩方阵对应的线性方程组。若系数矩阵奇异或不是方阵,应考虑 lstsq() 等方法。
css
numpy.linalg.solve(a, b)
参数说明:
• a:系数矩阵
• b:常数向量
求解:
ini
Ax = b
示例:
makefile
A = np.array([[3, 1], [1, 2]])
b = np.array([9, 8])
np.linalg.solve(A, b)# [2. 3.]
结果即为:
ini
x = 2y = 3
lstsq()
最小二乘解(Least Squares Solution)。
perl
numpy.linalg.lstsq(a, b, rcond=None)
参数说明:
• a:系数矩阵
• b:目标向量
• rcond:截断阈值
示例:
perl
A = np.array([[1, 1], [1, 2], [1, 3]])
b = np.array([1, 2, 2])
x, residuals, rank, s = np.linalg.lstsq(A, b, rcond=None)
最小二乘法常用于:
• 线性回归
• 数据拟合
四、矩阵特征值与特征向量
eig()
计算矩阵特征值与特征向量。
css
numpy.linalg.eig(a)
参数说明:
• a:方阵
返回:
go
w, v
其中:
• w:特征值
• v:特征向量
示例:
php
A = np.array([[2, 0], [0, 3]])
w, v = np.linalg.eig(A)print(w)# [2. 3.]
特征值分解常用于:
• PCA
• 动态系统分析
• 马尔可夫链
eigh()
计算实对称矩阵或 Hermitian 矩阵的特征值与特征向量。
css
numpy.linalg.eigh(a)
参数说明:
• a:实对称矩阵或 Hermitian 矩阵
返回:
go
w, v
其中:
• w:特征值
• v:特征向量
说明:
eigh() 专门用于实对称矩阵或 Hermitian 矩阵,通常比 eig() 更适合这类问题,数值上也更稳定。常用于:
• 协方差矩阵分析
• 主成分分析(PCA)
eigvals()
计算矩阵特征值,但不返回特征向量。
css
numpy.linalg.eigvals(a)
参数说明:
• a:输入方阵
示例:
cs
A = np.array([[2, 0], [0, 3]])
np.linalg.eigvals(A)# [2. 3.]
说明:
eigvals() 返回一般方阵的特征值,不返回特征向量。结果通常不保证排序;对于实矩阵,特征值也可能为复数。
eigvalsh()
计算实对称矩阵或 Hermitian 矩阵的特征值,但不返回特征向量。
javascript
numpy.linalg.eigvalsh(a, UPLO='L')
参数说明:
• a:实对称矩阵或 Hermitian 矩阵
• UPLO:指定使用矩阵的哪一部分参与计算
javascript
- 'L':使用下三角部分(默认)- 'U':使用上三角部分
返回:
按升序排列的特征值数组。
示例:
cs
A = np.array([[2, 1], [1, 2]])
np.linalg.eigvalsh(A)# array([1., 3.])
说明:
eigvalsh() 与 eigh() 类似,适用于实对称矩阵或复 Hermitian 矩阵。二者的区别在于:
• eigh():返回特征值和特征向量
• eigvalsh():只返回特征值
因此,当只关心特征值而不需要特征向量时,eigvalsh() 更直接,也更节省计算开销。
五、矩阵范数与条件数
norm()
计算向量或矩阵范数(Norm)。
python
numpy.linalg.norm(x, ord=None, axis=None, keepdims=False)
参数说明:
• x:输入向量或矩阵
• ord:范数类型。ord 的具体含义取决于输入对象(向量或矩阵)
python
常见类型(向量):- None:默认计算 2-范数- 1:L1 范数- 2:L2 范数
对于矩阵,ord=None 时通常对应默认矩阵范数;ord 的具体解释应结合输入维度理解
• axis:指定沿哪个轴计算范数
• keepdims:是否保留被约简的维度
示例:
apache
a = np.array([3, 4])
np.linalg.norm(a)# 5.0
说明:
这里计算的是向量长度(欧几里得范数):
。
cond()
计算矩阵条件数(Condition Number)。默认计算基于 2-范数的条件数。
python
numpy.linalg.cond(x, p=None)
参数说明:
• x:输入矩阵
• p:范数类型,默认使用 2-范数条件数
示例:
cs
A = np.array([[1, 2], [3, 4]])
np.linalg.cond(A)
说明:
条件数用于衡量矩阵的数值稳定性:条件数越大,数值误差越容易放大。
六、矩阵逆与伪逆
inv()
计算矩阵的逆矩阵。
css
numpy.linalg.inv(a)
参数说明:
• a:方阵
示例:
cs
A = np.array([[1, 2], [3, 4]])
np.linalg.inv(A)
说明:
输入必须是方阵,且该方阵可逆;否则会引发线性代数错误。
在数值计算中,若目的是求解线性方程组,通常优先使用 solve(),而不是先求逆再相乘。
pinv()
计算矩阵的伪逆(Moore-Penrose Pseudoinverse)。
css
numpy.linalg.pinv(a)
参数说明:
• a:输入矩阵
示例:
cs
A = np.array([[1, 2], [3, 4], [5, 6]])
np.linalg.pinv(A)
伪逆常用于:
• 不可逆矩阵
• 线性回归
• 最小二乘问题
七、矩阵行列式与秩
det()
计算矩阵行列式(Determinant)。
css
numpy.linalg.det(a)
参数说明:
• a:方阵
示例:
cs
A = np.array([[1, 2], [3, 4]])
np.linalg.det(A)# -2.0
说明:
行列式为 0 表示矩阵不可逆。
matrix_rank()
计算矩阵秩(Matrix Rank)。
css
numpy.linalg.matrix_rank(a)
参数说明:
• a:输入矩阵
示例:
cs
A = np.array([[1, 2], [2, 4]])
np.linalg.matrix_rank(A)# 1
说明:
矩阵秩表示矩阵中线性无关行(或列)的数量。
slogdet()
以更稳定的方式计算矩阵行列式的符号与对数绝对值。
css
numpy.linalg.slogdet(a)
参数说明:
• a:输入方阵
返回:
• sign:行列式的符号
• logabsdet:行列式绝对值的自然对数,即 log(abs(det(a)))
示例:
php
A = np.array([[1, 2], [3, 4]])
sign, logabsdet = np.linalg.slogdet(A)
print(sign) # -1.0print(logabsdet) # 约 0.693147...
说明:
因为 det(A) = -2,所以其符号 sign = -1;又因为 abs(det(A)) = 2,故 logabsdet = log(2) ≈ 0.693147。
补充说明:
slogdet() 适合处理行列式绝对值很大或很小的矩阵。与直接计算 det() 相比,它在数值上更稳定,更不容易因为浮点数范围限制而产生上溢或下溢。若需要恢复原行列式,可利用:
ini
det = sign * np.exp(logabsdet)
当矩阵行列式为 0 时,返回结果中 sign 为 0,logabsdet 为 -inf。
对复数矩阵,sign 可能是模长为 1 的复数,而不只是 -1、0、1。
📘 小结
NumPy 在 numpy.linalg 模块中提供了一组用于线性代数计算的函数体系,包括矩阵与向量乘法及幂运算(matmul、dot、multi_dot、matrix_power)、矩阵分解(svd、qr、cholesky)、线性方程组求解(solve、lstsq)、特征值与特征向量计算(eig、eigh、eigvals、eigvalsh),以及范数、条件数、逆矩阵、伪逆、行列式、对数行列式和矩阵秩等分析工具。这些函数广泛应用于科学计算、机器学习、信号处理与数值优化等领域。

"点赞有美意,赞赏是鼓励"