我建议改变所有这些进口:from numpy import mat
from numpy import *
from numpy import matrix
from numpy import linalg
只有一个:
^{pr2}$
那你就可以了d = np.array(...)
# d = np.arange(15).reshape(3,5)
M = np.matrix(d)
M.I # a matrix has an I property, but an array does not
d.diagonal() # diagonal is a method, not a property
np.diagonal(d) # diagonal is also a function
np.linalg.inv(d)不起作用-它给出一个错误,目标是数组不是正方形。所以很明显{}返回的是另一种逆。请参阅我下面关于pinv的说明。在
numpy(通常是Python)有函数、方法和属性(属性)。区别清楚吗?在
许多numpy函数最终调用主数组对象的相应方法。通常这并不重要,只是为了方便通话。在
np.matrix是一个子类,它有许多自己的方法。例如,请注意In [817]: M.diagonal()
Out[817]: matrix([[ 0, 6, 12]])
In [818]: d.diagonal()
Out[818]: array([ 0, 6, 12])
diagonal返回了相同的数字,但对于M,它返回的是同一类的对象,根据类定义,该对象是2d
d.T,M.I访问properties。它们不需要方法所需的(),但在许多方面它们是相同的。np.matrix定义了I,但是{}没有。在
如果您习惯于在MATLAB中使用矩阵,np.matrix类可以简化转换。但是如果这是您第一次使用这样的数组,我建议您使用np.array。np.matrix类只会增加混乱。在
M.I与{}相同。在
它的代码是(使用help(M.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))
所以这意味着M.I使用pinv,而不是{}。np.linalg.pinv(d)工作正常。在