Scipy inv(A)vs AI

Jea*_*Luc 3 python numpy scipy

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

inv(A)
Run Code Online (Sandbox Code Playgroud)

和

A.I
Run Code Online (Sandbox Code Playgroud)

两者都返回包含矩阵A的逆的Numpy数组.

A.I在我看来,它正在从矩阵类中访问一个变量,该矩阵类存储矩阵的逆矩阵; 然而,这意味着每次A改变时,必须重新计算A的倒数(这对我来说似乎不合逻辑).

unu*_*tbu 5

A.I并且numpy.linalg.inv不一样.

A.I是一个调用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))
Run Code Online (Sandbox Code Playgroud)

因此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
Run Code Online (Sandbox Code Playgroud)

此外,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'>
Run Code Online (Sandbox Code Playgroud)

一个属性,就像A.I在语法上看起来像一个属性,但它实际上调用一个函数(在这种情况下A.getI).因此,不存储逆的值.每次Python计算时A.I,A.getI()都会调用该函数,并返回该函数的结果.

有关属性的更多信息,请参阅属性:由get/set方法管理的属性.