本系列是《NumPy 速通》的配套章节。
线性代数是 NumPy 的"根"——NumPy 本来就是为科学计算而生的。矩阵乘法、求逆、解方程组、特征值,在机器学习、图像处理、物理模拟中无处不在。
本章只讲 np.linalg 里最常用的函数,你不需要是数学专家,理解"做什么、什么时候用"就够了。
矩阵乘法:@ vs *(先复习这一课)
最重要的一课:* 是逐元素乘法,@ 才是矩阵乘法(点积)。
import numpy as np
A = np.array([[1, 2],
[3, 4]])
B = np.array([[5, 6],
[7, 8]])
A * B # 逐元素乘法
# [[ 5 12]
# [21 32]]
A @ B # 矩阵乘法(行 × 列)
# [[19 22]
# [43 50]]
np.dot(A, B) # 和 @ 等价
⚠️ 灵魂警告(再次强调):用错符号结果完全不同。
@要求内维相等:(m,n) @ (n,k) → (m,k)- 一维向量
@:np.dot([1,2,3], [4,5,6])→ 标量32(内积)- 神经网络前向传播
W @ x、线性回归X @ theta都用@
常用线性代数函数总览
np.linalg.inv(A) # 逆矩阵(A @ inv(A) = I)
np.linalg.det(A) # 行列式(判断是否可逆、体积缩放)
np.linalg.eig(A) # 特征值 & 特征向量
np.linalg.solve(A, b) # 解线性方程组 A x = b(推荐)
np.linalg.norm(v) # 向量的模长
np.linalg.matrix_rank(A)# 矩阵的秩
np.linalg.qr(A) # QR 分解
np.linalg.svd(A) # 奇异值分解(SVD,压缩/降维核心)
解方程组:np.linalg.solve
# 2x + 3y = 8
# x + y = 3
A = np.array([[2, 3],
[1, 1]])
b = np.array([8, 3])
x = np.linalg.solve(A, b) # [1. 2.] 即 x=1, y=2
为什么用 solve 而不是 inv(A) @ b?
# 不推荐:先求逆再乘(慢、数值不稳定)
x = np.linalg.inv(A) @ b
# 推荐:直接求解(快、稳定)
x = np.linalg.solve(A, b)
💡
solve内部用高斯消去等数值稳定的算法,不显式求逆,精度和速度都更好。解线性方程组一律用solve。验证解是否正确:
np.allclose(A @ x, b) # True 代回去检查
逆矩阵与验证
A_inv = np.linalg.inv(A)
I = A @ A_inv # 应该约等于单位矩阵
np.round(I) # [[1. 0.] [0. 1.]]
np.allclose(A @ A_inv, np.eye(2)) # True 更严谨的检查
⚠️ 灵魂警告:不是所有矩阵都可逆!行列式为 0(奇异矩阵)时
inv报错:np.linalg.inv(np.array([[1, 2], [2, 4]])) # ❌ LinAlgError: Singular matrix求逆前先
np.linalg.det(A)检查(非零才可逆),或用solve代替(更稳)。
行列式 det
np.linalg.det(A) # -2.0000000000000004(浮点误差,接近 -2)
det ≠ 0→ 矩阵可逆、方程组有唯一解- 几何意义:矩阵把"单位面积"缩放多少倍
特征值:np.linalg.eig
vals, vecs = np.linalg.eig(A)
vals # array([-0.37228132, 5.37228132]) 特征值
vecs # 每列是对应的特征向量
eig返回(特征值数组, 特征向量矩阵),每列一个特征向量- 验证:
A @ v = λ v(特征向量乘 A 等于缩放 λ 倍)
特征值有什么用?
| 应用 | 用途 |
|---|---|
| 主成分分析 PCA | 降维、去冗余 |
| 图像/数据压缩 | SVD 分解后保留大奇异值 |
| PageRank | 网页排名(特征向量) |
| 动力学/稳定性 | 系统是否收敛 |
理解"它分解出一个矩阵的本征结构"即可,具体推导用到时再看。
实战:最小二乘拟合(线性回归)
线性回归 y ≈ X @ theta 的解,用 np.linalg.lstsq 一步到位:
# 数据点:(1,2) (2,3) (3,5) 拟合 y = a + b*x
X = np.array([[1, 1],
[1, 2],
[1, 3]])
y = np.array([2, 3, 5])
theta, residuals, rank, s = np.linalg.lstsq(X, y, rcond=None)
# theta ≈ [0.333, 1.5] → y ≈ 0.333 + 1.5x
这就是"用最小二乘解超定方程组"——机器学习线性回归的数学核心。
小结
| 函数 | 作用 | 场景 |
|---|---|---|
A @ B |
矩阵乘法 | 前向传播、变换 |
np.linalg.solve(A, b) |
解方程组 | 求解,推荐优先 |
np.linalg.inv(A) |
逆矩阵 | 理论上/验证用 |
np.linalg.det(A) |
行列式 | 判断可逆性 |
np.linalg.eig(A) |
特征值/向量 | PCA、降维 |
np.linalg.lstsq |
最小二乘 | 线性回归拟合 |
- ⚠️
*逐元素 vs@矩阵乘法 - 解方程组用
solve(快且稳定),别inv @ b - 求逆前查
det,奇异矩阵会崩 - 特征值 → PCA/降维;
lstsq→ 回归拟合
上一篇:第 12 章 随机数
🎉 恭喜!13 章全部学完。 现在你已经掌握了 NumPy 的全部核心知识。回到《NumPy 速通》看一遍主线,然后动手敲代码吧。
上一篇:第 12 章 随机数
🎉 恭喜!13 章全部学完。 现在你已经掌握了 NumPy 的全部核心知识。回到《NumPy 速通》看一遍主线,然后动手敲代码吧。