创建numpy矩阵的逆和对角线

时间:2015-08-20 10:59:45

标签: python numpy matrix

我正在尝试反转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'

有任何建议可以得到反向和对角线吗?

3 个答案:

答案 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.TM.I访问properties。这些不需要方法所做的(),但在许多方面它们是相同的。 np.matrix已定义I,但np.array尚未定义。

如果您习惯在MATLAB中使用矩阵,np.matrix类可以简化转换。但如果这是你第一次使用这样的数组,我建议坚持使用np.arraynp.matrix类只会增加混乱。

M.IM.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而不是invnp.linalg.pinv(d)有效。