numpy.linalg.inv#
- linalg.inv(a)[source]#
计算矩阵的逆矩阵。
给定一个方阵 a,返回满足
a @ ainv = ainv @ a = eye(a.shape[0])
的矩阵 ainv。- 参数:
- a(…, M, M) array_like
要反转的矩阵。
- 返回:
- ainv(…, M, M) ndarray 或 matrix
矩阵 a 的逆矩阵。
- 引发:
- LinAlgError
如果 a 不是方阵或反转失败。
另请参阅
scipy.linalg.inv
SciPy 中的类似函数。
numpy.linalg.cond
计算矩阵的条件数。
numpy.linalg.svd
计算矩阵的奇异值分解。
注释
版本 1.8.0 中的新功能。
广播规则适用,有关详细信息,请参阅
numpy.linalg
文档。如果检测到 a 为奇异矩阵,则会引发
LinAlgError
。如果 a 条件很差,则可能会或可能不会引发LinAlgError
,并且由于浮点错误,结果可能不准确。参考文献
[1]示例
>>> import numpy as np >>> from numpy.linalg import inv >>> a = np.array([[1., 2.], [3., 4.]]) >>> ainv = inv(a) >>> np.allclose(a @ ainv, np.eye(2)) True >>> np.allclose(ainv @ a, np.eye(2)) True
如果 a 是一个矩阵对象,则返回值也是一个矩阵
>>> ainv = inv(np.matrix(a)) >>> ainv matrix([[-2. , 1. ], [ 1.5, -0.5]])
可以一次计算多个矩阵的逆矩阵
>>> a = np.array([[[1., 2.], [3., 4.]], [[1, 3], [3, 5]]]) >>> inv(a) array([[[-2. , 1. ], [ 1.5 , -0.5 ]], [[-1.25, 0.75], [ 0.75, -0.25]]])
如果矩阵接近奇异矩阵,即使没有引发
LinAlgError
,计算出的逆矩阵也可能不满足a @ ainv = ainv @ a = eye(a.shape[0])
>>> a = np.array([[2,4,6],[2,0,2],[6,8,14]]) >>> inv(a) # No errors raised array([[-1.12589991e+15, -5.62949953e+14, 5.62949953e+14], [-1.12589991e+15, -5.62949953e+14, 5.62949953e+14], [ 1.12589991e+15, 5.62949953e+14, -5.62949953e+14]]) >>> a @ inv(a) array([[ 0. , -0.5 , 0. ], # may vary [-0.5 , 0.625, 0.25 ], [ 0. , 0. , 1. ]])
要检测条件很差的矩阵,可以使用
numpy.linalg.cond
计算其条件数 [1]。条件数越大,矩阵的条件越差。根据经验,如果条件数cond(a) = 10**k
,则除了由于算术方法导致的精度损失而导致的数值方法损失之外,您最多可能会损失k
位精度。>>> from numpy.linalg import cond >>> cond(a) np.float64(8.659885634118668e+17) # may vary
也可以通过直接检查矩阵的奇异值来检测条件很差的情况。最大奇异值与最小奇异值之间的比率是条件数
>>> from numpy.linalg import svd >>> sigma = svd(a, compute_uv=False) # Do not compute singular vectors >>> sigma.max()/sigma.min() 8.659885634118668e+17 # may vary