我正在尝试反转numpy数组,
from numpy import mat
from numpy import *
from numpy import matrix
from numpy import linalg
d =array ([ (0, 1, 2, 3, 4),
( 5, 6, 7, 8, 9),
(10, 11, 12, 13, 14)])
print d.T
print d.I
print d.diagonal
#above line gives <built-in method diagonal of numpy.ndarray object at 0x7fdf40a263f0>
print numpy.linalg.inv(d)
我正在
AttributeError: 'numpy.ndarray' object has no attribute 'I'
有任何建议可以得到反向和对角线吗?
答案 0 :(得分:1)
如果您将d
转换为np.matrix
,您将获得以下方法:
d = np.matrix(d)
然后:
d.I
d.diagonal()
会奏效。
答案 1 :(得分:1)
A.diagonal
是numpy.ndarray的一种方法,就像打印出来的那样。因此,@ Saullo Castro的解决方案也适用于numpy数组,无需转换为np.matrix
。
import numpy as np
A = np.arange(25).reshape((5,5))
diag = A.diagonal()
# array([ 0, 6, 12, 18, 24])
Numpy Arrays没有方法来计算矩阵的逆矩阵,但您可以使用numpy.linalg.inv
轻松完成,就像您根据代码示例尝试过一样。
答案 2 :(得分:1)
我建议更改所有这些导入:
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)
有效。