我建议更改所有这些导入:
from numpy import mat
from numpy import *
from numpy import matrix
from numpy import linalg
只有一个:
import numpy as np
那你就可以了
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) 不起作用 - 它给出了一个错误,反对数组不是正方形的。所以很明显M.I 正在返回一种不同的逆。请参阅下面关于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,但 np.array 尚未定义。
如果您习惯在 MATLAB 中使用矩阵,np.matrix 类可能会简化转换。但如果这是您第一次使用这样的数组,我建议您坚持使用np.array。 np.matrix 类只会增加混乱。
M.I 与M.getI() 相同。
它的代码是(使用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 而不是inv。 np.linalg.pinv(d) 有效。