Scipy inv(A)vs A.I

时间:2013-01-10 02:45:04

标签: python numpy scipy

我对Python很新,我想知道它们之间有什么区别:

inv(A)

A.I

两者都返回一个Numpy数组,其中包含矩阵的反函数 A

A.I看起来像是从矩阵类中访问变量,该矩阵类存储矩阵的逆矩阵;但是,这意味着每次 A 更改时,必须重新计算 A 的反转(这对我来说似乎不合逻辑)。

2 个答案:

答案 0 :(得分:5)

A.Inumpy.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.invnumpy.linalg.invnumpy.dual.pinvnumpy.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版本和numpyI(以及同样T等)可以是@property,也可以是同一事物的自定义实现

如果您以前从未见过这个想法,那么您可以创建一些看起来像数据属性(也称为“成员变量”)的东西,但每次访问时都会调用getter方法。

因此,每次更改A.I时都不会强制重新计算A,而是每次访问A.I时都会重新计算。{/ p>

当然,根据您的使用模式,这可能不会更好;它甚至可能更糟。但是,就像任何其他方法一样,如果它有帮助,那么就没有什么能阻止numpy进行记忆(缓存结果)。

在封面下,A.I的获取者为A.getI(),因此这些是等效的,两者都可能等同于inv(A)。 (具有相同功能的自由函数foo(A)和方法A.foo()numpy中非常常见。)除了unutbu指出之外,还有多个方法称为{{1 }}; inv将等同于其中一个,但不一定是您直接导入主命名空间的那个。