np.linalg.inv()仅适用于二维方阵且必须可逆;需检查维度、秩、数据类型(推荐float64)及条件数,解线性方程组优先用np.linalg.solve(),奇异矩阵应改用pinv或lstsq。

矩阵必须是方阵才能用 np.linalg.inv()
不是所有数组都能求逆,np.linalg.inv() 会直接报错 LinAlgError: Singular matrix 或 Matrix is not square。它只接受二维、行数等于列数的 ndarray,且该矩阵必须可逆(满秩)。常见踩坑是拿一维数组、DataFrame 直接传进去,或者没检查是否退化(比如两行完全相同)。
实操建议:
- 先用
a.ndim == 2 and a.shape[0] == a.shape[1]确认是方阵 - 用
np.linalg.matrix_rank(a)检查秩是否等于维度,避免运行时报奇异矩阵错误 - 如果来自 pandas,记得先转
df.values,别传df本身——否则可能触发隐式类型转换或广播异常 - 小矩阵(如 3×3)可以加
np.allclose(a @ np.linalg.inv(a), np.eye(a.shape[0]))快速验算
np.linalg.inv() 对 float32 和 float64 行为不同
精度直接影响结果可靠性。float32 下逆矩阵误差可能大到不可接受,尤其当矩阵条件数高时;float64 是默认且推荐类型,但如果你从 torch 或某些传感器数据读入的是 float32,得手动转。
实操建议:
- 显式转类型:
a = a.astype(np.float64)再调用np.linalg.inv() - 用
np.linalg.cond(a)粗略看条件数:> 1e12 就要警惕 float32 下的结果失真 - 不建议在 float32 上做多次逆运算链(比如 A⁻¹B⁻¹),误差会累积放大
替代方案:用 np.linalg.solve() 更稳
如果你其实只是想解 Ax = b,而不是真需要 A⁻¹ 这个矩阵,那 np.linalg.solve(A, b) 不仅更快,数值稳定性也更好——它内部用 LU 分解,不显式构造逆矩阵。
实操建议:
- 求解单次线性系统,优先写
x = np.linalg.solve(A, b),别写x = np.linalg.inv(A) @ b - 多个右端项
b1, b2, ..., bn?把它们堆成列向量B(形状 (n, k)),再用np.linalg.solve(A, B),比循环求逆快得多 - 如果真要逆矩阵(比如做协方差变换、批量仿射),那还是得用
np.linalg.inv(),但务必确认 A 的良态性
奇异矩阵报错时,别硬 try-except 吞掉 LinAlgError
遇到 LinAlgError: Singular matrix,说明矩阵不满秩,强行“绕过”只会让后续计算崩得更隐蔽。常见错误是加个小常量单位阵(A + eps * np.eye(n))假装可逆,但这会扭曲原始问题的几何意义。
实操建议:
- 先查来源:是不是数据有共线特征?列归一化后用
np.corrcoef()看相关性 - 用
np.linalg.pinv()(伪逆)代替,它对奇异矩阵安全,但返回的是最小二乘解,语义已不同 - 如果是统计建模场景(如 OLS),直接换
scipy.linalg.lstsq()或statsmodels,它们内置了秩判断和降维逻辑
逆矩阵看着简单,但实际中多数崩溃都发生在“以为它能算”的那一刻——形状、类型、秩、精度,四个点里漏一个,结果就不可信。别依赖自动兜底,每一步都亲手 check 才是实操底线。










