numpy.linalg.inv仅适用于方阵且满秩的矩阵;非方阵或奇异矩阵会报linalgerror;应先检查shape和秩,优先用solve解方程,注意数据类型、维度及条件数影响。

为什么 numpy.linalg.inv 有时算不出结果,直接报错?
因为逆矩阵只对**方阵且满秩**的数组有效。只要 a 不是方阵(比如形状是 (3, 4)),或者虽然方阵但行列式为 0(比如两行完全相同),numpy.linalg.inv 就会抛出 LinAlgError: Singular matrix。
常见误用场景:拿归一化后的特征矩阵、PCA降维后的结果、或拼接出来的宽表直接去求逆——这些大概率不是可逆的。
- 先用
a.shape[0] == a.shape[1]检查是否为方阵 - 再用
np.linalg.matrix_rank(a) == a.shape[0]确认满秩(比算行列式更稳定) - 若只是想解线性方程
Ax = b,优先用np.linalg.solve(A, b),它内部自动选最优算法,不显式求逆,更稳也更快
用 numpy.linalg.inv 前必须注意的三个参数细节
numpy.linalg.inv 本身没有可调参数,但它对输入极其敏感——类型、维度、精度都会影响结果是否可用。
- 输入必须是
float64或complex128;如果传入int32或uint8,会静默转成浮点,但可能因精度丢失导致本该可逆的矩阵被判为奇异 - 高维数组(如 shape 为
(5, 4, 4))会被当作“批量方阵”处理,返回同 batch size 的逆矩阵数组;但若 shape 是(4, 4, 5),就会报错 —— 它只接受最后两个轴为方阵 - 如果矩阵条件数极大(比如 > 1e15),即使没报错,
inv返回的结果也可能严重失真;此时应改用np.linalg.pinv(伪逆)并设rcond
和 scipy.linalg.inv 比,该选哪个?
功能几乎一致,但底层实现不同:scipy.linalg.inv 默认调用更现代的 LAPACK 例程,对某些病态矩阵鲁棒性略好,还支持更多选项(如 overwrite_a=True 节省内存)。
- 如果你已装了
scipy,且处理的是大型或临界条件矩阵,建议用scipy.linalg.inv - 如果只是小规模教学或快速验证,
numpy.linalg.inv足够,且无额外依赖 - 两者都不做自动缩放或预处理;若矩阵元素量级差异大(如同时含 1e-8 和 1e6),手动用
np.diag(1.0 / np.linalg.norm(a, axis=0)) @ a做列归一化后再求逆,效果常更好
一个典型错误:用 inv 算 A @ B 的逆,却写成 inv(A) @ inv(B)
这是代数常见误解:inv(A @ B) 等于 inv(B) @ inv(A),顺序必须反过来。写反会导致结果完全错误,且不容易被数值误差掩盖。
- 正确写法:
np.linalg.inv(B) @ np.linalg.inv(A)(当 A、B 都可逆时) - 更安全的做法:直接算
np.linalg.inv(A @ B),避免中间步骤放大误差 - 如果 A、B 是大型稀疏矩阵,别硬算逆——改用
scipy.sparse.linalg.splu或迭代法
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











