我是相當新的Python和我想知道有什麼區別之間:SciPy的INV(A)VS AI
inv(A)
和
A.I
兩個返回一個包含一個numpy的陣列矩陣的倒數A。
A.I
在我看來,它正在訪問存儲矩陣逆矩陣類的變量;然而,這意味着每次更改A時,必須重新計算A的倒數(這對我來說似乎不合邏輯)。
我是相當新的Python和我想知道有什麼區別之間:SciPy的INV(A)VS AI
inv(A)
和
A.I
兩個返回一個包含一個numpy的陣列矩陣的倒數A。
A.I
在我看來,它正在訪問存儲矩陣逆矩陣類的變量;然而,這意味着每次更改A時,必須重新計算A的倒數(這對我來說似乎不合邏輯)。
A.I
和numpy.linalg.inv
是不一樣的。
A.I
是property它調用matrix.getI:
def getI(self):
M,N = self.shape
if M == N:
from numpy.dual import inv as func
else:
from numpy.dual import pinv as func
return asmatrix(func(self))
所以getI
任取決於的形狀numpy.dual.inv(正方形矩陣的乘法逆元素)或numpy.dual.pinv(穆爾 - 彭羅斯僞逆)調用矩陣。
如果跟蹤通過定義(在dual.py),你會發現, numpy.dual.inv
是numpy.linalg.inv
和numpy.dual.pinv
是numpy.linalg.pinv
。
In [69]: s = np.random.random((3,4))
In [70]: t = np.matrix(s)
In [71]: t.I
Out[71]:
matrix([[ 1.09509751, -0.56685735, 0.51704085],
[-1.59777153, 0.2777383 , 1.25579378],
[ 0.81899054, 0.7594223 , -0.82760378],
[ 0.02845906, 0.50418885, -0.2091376 ]])
In [72]: np.linalg.inv(t)
...
LinAlgError: Array must be square
此外,np.linalg.inv
可以應用於numpy的陣列(和返回numpy的陣列),以及可應用於numpy的矩陣。matrix.I
屬性特定於numpy矩陣,並返回另一個numpy矩陣。
In [60]: x = np.random.random((3,3))
In [62]: y = np.matrix(x)
In [64]: type(y.I)
Out[64]: <class 'numpy.matrixlib.defmatrix.matrix'>
In [65]: type(np.linalg.inv(x))
Out[65]: <type 'numpy.ndarray'>
的屬性,像A.I
看起來像語法的屬性,但它實際上調用一個函數(在這種情況下,A.getI
)。所以倒數的值沒有被存儲。每次Python評估A.I
時,都會調用函數A.getI()
,並返回該函數的結果。
有關屬性的更多信息,請參閱Properties: attributes managed by get/set methods。
根據您的Python和numpy
,I
(以及類似T
等)的版本,要麼是@property
,或同樣的事情自定義實現。
如果你以前從未見過這樣的想法,你可以創建一個看起來像數據屬性(又稱「成員變量」)的東西,但每次訪問它時都會調用getter方法。
因此,每當您更改A
時,都不會強制重新計算A.I
,而是您每次訪問A.I
時都需要重新計算A.I
。
當然,這可能不會更好,這取決於您的使用模式;它可能會更糟。但是,就像任何其他方法一樣,如果有幫助,沒有任何東西可以阻止記憶(緩存結果)。
在封面之下,A.I
的吸氣劑是A.getI()
,所以它們是等效的,兩者可能相當於inv(A)
。 (具有免費功能foo(A)
和方法A.foo()
做同樣的事情是相當普遍的所有numpy
。)除了,正如unutbu指出,有不止一種方法稱爲inv
; A.I
將等同於其中的一個,但不一定是您直接導入主名稱空間的那個。
+1對於詳細的答案,儘管我不確定您是否已經強調過似乎是OP的主要關注點:儘管'AI'看起來像一個存儲值,但它每次訪問時都會進行計算它。所以對於方矩陣來說,它基本上是用於完全相同操作的語法糖。 – Jaime
@Jamie:謝謝,我已經忘記了這部分問題。我最後補充了一點,希望能夠糾正這一點。 – unutbu
謝謝!你的回答非常有幫助和簡潔!閱讀attrubutes和get/set方法。我不明白爲什麼找到矩陣的逆將使用get/set屬性。這似乎是合乎邏輯的,'xI()',我認爲'xI'更愉快,但是這意味着必須記住是否放置括號或不放置... –