应优先使用 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 参数有什么区别?
这两种输入看起来很相似,但语义和默认行为不同,混用时容易误解结果。
Python 3.14.2
Python 3.14.2是Python编程语言于2025年12月5日发布的稳定版本,属于3.14系列的第二次维护更新。该版本包含18个修复项目,重点解决多过程、数据和正则表达模块的回归问题,修复CVE-2025-12084等安全漏洞。这个版本标志着Python发展的一个重要里程碑,即自由线程模式(删除GIL)正式得到官方支持。
下载立即学习“Python免费学习笔记(深入);
-
solve(A, b):严格要求A可逆,只回到唯一的解决方案x;b必须能够广播成匹配的形状 -
lstsq(A, b, rcond=None):不要求A方阵或满秩;回到四元组,第一个是解;rcond控制奇异值截断,默认情况下None(即机器精度),设置为-1可禁用警告 - 当
A正好方阵满了,两者的结果在数值误差内是一致的;但是lstsq多一步 SVD 分解,成本更高
实际编写代码时,先使用 solve;报错后再切 lstsq 并检查返回的秩序和残差。不要一开始就默认使用 lstsq——它解决了更广泛的问题和更高的成本。