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),以及范数、条件数、逆矩阵、伪逆、行列式、对数行列式和矩阵秩等分析工具。这些函数广泛应用于科学计算、机器学习、信号处理与数值优化等领域。

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

相关推荐
2601_9578885620 小时前
从数据隔离到全链路分发:短视频矩阵系统的防关联底层逻辑与提效实践
线性代数·矩阵
_Evan_Yao20 小时前
线性代数 + 编程:用Python实现向量和矩阵运算
python·线性代数·矩阵
计算机安禾21 小时前
【线性代数】线代「行/列变换」使用场景总总结
线性代数
坏孩子的诺亚方舟21 小时前
FPGA神经网络数学基础0
人工智能·神经网络·线性代数·fpga开发
吃好睡好便好2 天前
矩阵的乘法运算
数据结构·人工智能·学习·线性代数·算法·matlab·矩阵
嗝o゚2 天前
CANN asnumpy 库——昇腾 NPU 原生 NumPy 兼容层
人工智能·numpy·cann·asnumpy
吃好睡好便好2 天前
矩阵的求幂运算
人工智能·学习·线性代数·算法·matlab·矩阵
会Tk矩阵群控的小木2 天前
深入解析tk矩阵系统ADB实时投屏与多设备控制实现
运维·线性代数·adb·矩阵·个人开发
跨境技工小黎2 天前
2026海外社媒新玩法:如何用AI批量运营海外社媒矩阵?
人工智能·线性代数·矩阵