numpy.linalg.inv#
- linalg.inv(a)[原始碼]#
計算矩陣的反矩陣。
給定一個方陣 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
計算矩陣的奇異值分解。
註解
廣播規則適用,詳細資訊請參閱
numpy.linalg
文件。如果偵測到 a 為奇異矩陣,則會引發
LinAlgError
。如果 a 的條件不良,則可能會或可能不會引發LinAlgError
,且結果可能因浮點錯誤而不準確。參考文獻
[1]Wikipedia, “條件數”, https://en.wikipedia.org/wiki/Condition_number
範例
>>> 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