我对Python很新,我想知道它们之间有什么区别:
inv(A)
和
A.I
两者都返回一个Numpy数组,其中包含矩阵的反函数 A 。
A.I
看起来像是从矩阵类中访问变量,该矩阵类存储矩阵的逆矩阵;但是,这意味着每次 A 更改时,必须重新计算 A 的反转(这对我来说似乎不合逻辑)。
答案 0 :(得分:5)
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(Moore-Penrose伪逆)。
如果您追踪定义(在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。
答案 1 :(得分:2)
根据您的Python版本和numpy
,I
(以及同样T
等)可以是@property
,也可以是同一事物的自定义实现
如果您以前从未见过这个想法,那么您可以创建一些看起来像数据属性(也称为“成员变量”)的东西,但每次访问时都会调用getter方法。
因此,每次更改A.I
时都不会强制重新计算A
,而是每次访问A.I
时都会重新计算。{/ p>
当然,根据您的使用模式,这可能不会更好;它甚至可能更糟。但是,就像任何其他方法一样,如果它有帮助,那么就没有什么能阻止numpy
进行记忆(缓存结果)。
在封面下,A.I
的获取者为A.getI()
,因此这些是等效的,两者都可能等同于inv(A)
。 (具有相同功能的自由函数foo(A)
和方法A.foo()
在numpy
中非常常见。)除了unutbu指出之外,还有多个方法称为{{1 }}; inv
将等同于其中一个,但不一定是您直接导入主命名空间的那个。