我的代碼的一部分使用numpy.linalg.inv顛倒矩陣(真的是一個ndarray)。然而,這經常出錯如下:numpy爲什麼說這個矩陣是單數*有時*?
numpy.linalg.linalg.LinAlgError: Singular matrix
這將是很好,如果矩陣實際上是單數。但似乎並非如此。
例如,我在打印矩陣之前嘗試將其反轉。所以就在打印錯誤之前:
[[ 0.76400334 0.22660491]
[ 0.22660491 0.06721147]]
...然後當它嘗試反轉該矩陣時返回上述奇點錯誤。但從我可以告訴這個矩陣是可逆的。後來被問到時,Numpy似乎也同意。
>>> numpy.linalg.inv([[0.76400334, 0.22660491], [0.22660491, 0.06721147]])
array([[ 2.88436275e+07, -9.72469076e+07],
[ -9.72469076e+07, 3.27870046e+08]])
這裏的確切的代碼片斷:
print np.dot(np.transpose(X), X)
print np.linalg.inv(np.dot(np.transpose(X),X))
第一行打印上面的矩陣;第二行失敗。
那麼什麼區分上面的兩個動作?爲什麼獨立代碼即使在我的腳本中出錯也能正常工作?
編輯:每Beauvel上校的請求,如果我做
try:
print np.dot(np.transpose(X), X)
z = np.linalg.inv(np.dot(np.transpose(X), X))
except:
z = "whoops"
print z
它輸出
[[ 0.01328185 0.1092696 ]
[ 0.1092696 0.89895982]]
whoops
,但對自己嘗試此我得到
>>> numpy.linalg.inv([[0.01328185, 0.1092696], [0.1092696, 0.89895982]])
array([[ 2.24677775e+08, -2.73098420e+07],
[ -2.73098420e+07, 3.31954382e+06]])
你確定它的這個輸入創建這個問題?你可以在代碼中使用try catch(例如,如果你使用循環)來確切地知道它何時發生?還有什麼是X? –
@ColonelBeauvel:我很確定它是這個輸入,因爲print np.dot(np.transpose(X),X)返回我上面寫的矩陣,然後下一行產生錯誤。 –
有沒有理由失敗,所以...你可以肯定與嘗試趕上,並把一個pdb.set_trace()在失敗的情況下,以便您可以調查的代碼? –