应优先使用 np.linalg.solve(a, b) 求解线性方程组 $ax = b$,因其基于带主元 lu 分解,比 np.linalg.inv(a) @ b 更快、更稳定;要求 a 为方阵且满秩,b 形状需匹配,否则抛出 linalgerror。

numpy.linalg.solve 是求解形如 Ax = b 的线性方程组最直接、最推荐的方式,前提是 A 是方阵且非奇异(可逆)。别用 inv 手动算逆矩阵——慢、数值不稳定、还容易出错。
什么时候该用 numpy.linalg.solve?
你手头有明确的系数矩阵 A(ndarray,形状为 (n, n))和右侧常数向量 b(形状为 (n,) 或 (n, 1)),目标是求唯一解 x。这是最常见、最干净的场景。
-
A必须是二维、方阵;b必须是一维或列向量(shape == (n,)或(n, 1)) - 如果
A接近奇异(条件数很大),solve会发出LinAlgWarning,但不会报错——结果可能严重失真,得自己检查np.linalg.cond(A) - 它内部调用 LAPACK 的
dgesv(双精度)等例程,比手动np.linalg.inv(A) @ b快 2–3 倍,精度也更高
遇到 LinAlgError: Singular matrix 怎么办?
说明 A 不可逆,方程组无唯一解:要么无解,要么有无穷多解。此时 solve 直接抛异常,不给你模糊结果。
- 先用
np.linalg.matrix_rank(A)看秩;再对比A.shape[0]—— 若秩不足,就不是满秩方阵 - 想求最小二乘解(哪怕不满秩),改用
np.linalg.lstsq(A, b, rcond=None),它返回解、残差、秩、奇异值 - 如果确定是欠定(变量多于方程),且想要一个特定解(比如范数最小的),
lstsq默认就返回最小二乘最小范数解;也可用np.linalg.pinv(A) @ b,但更慢
np.linalg.solve 和 np.linalg.lstsq 参数差异在哪?
两者输入看起来相似,但语义和默认行为不同,混用容易误解结果。
-
solve(A, b):严格要求A可逆,只返回唯一解x;b必须能广播成匹配形状 -
lstsq(A, b, rcond=None):不要求A方阵或满秩;返回四元组,其中第一个才是解;rcond控制奇异值截断,默认None(即用机器精度),设为-1可禁用警告 - 当
A恰好方阵且满秩时,两者结果在数值误差内一致;但lstsq多一步 SVD 分解,开销更大
实际写代码时,先用 solve;报错后再切到 lstsq 并检查返回的秩和残差。别一开始就默认用 lstsq——它解决的是更广的问题,代价也更高。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











