NumPy 函数手册:线性代数

在线性代数、科学计算以及机器学习中,经常需要进行矩阵乘法、求解线性方程组、矩阵分解以及向量与矩阵范数计算等操作。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),以及范数、条件数、逆矩阵、伪逆、行列式、对数行列式和矩阵秩等分析工具。这些函数广泛应用于科学计算、机器学习、信号处理与数值优化等领域。

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

相关推荐
AI科技星5 小时前
基于v≡c光速螺旋理论的正确性证明:严格遵循科学方法论的完整路径
c语言·开发语言·人工智能·线性代数·算法·机器学习·数学建模
RFdragon9 小时前
分享本周所学——三维重建算法3D Gaussian Splatting(3DGS)
人工智能·线性代数·算法·机器学习·计算机视觉·矩阵·paddlepaddle
MediaTea14 小时前
NumPy 函数手册:文件读写
numpy
Cathy Bryant1 天前
拓扑学-毛球定理
笔记·线性代数·算法·矩阵·拓扑学·高等数学
泡泡茶壶Wending1 天前
OPENGL之摄像机与视图变换矩阵
线性代数·矩阵
dinl_vin2 天前
Python 数据分析入门系列(一):从NumPy开始
python·数据分析·numpy
2301_766558652 天前
深度解析:矩阵跃动小陌GEO语义场建模原理,筑牢企业AI搜索占位技术壁垒
人工智能·线性代数·矩阵
别或许2 天前
6、线性代数之二次型(知识总结)
线性代数
剑穗挂着新流苏3122 天前
201_深度学习的数学底座:PyTorch 线性代数与范数实战
pytorch·深度学习·线性代数