【问题标题】:Creating inverse and diagonal of numpy matrices创建numpy矩阵的逆和对角线
【发布时间】:2015-11-13 23:44:37
【问题描述】:

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

有什么建议可以得到反向和对角线?

【问题讨论】:

标签: python numpy matrix


【解决方案1】:

如果您将d 转换为np.matrix,您将获得这些方法:

d = np.matrix(d)

然后:

d.I
d.diagonal()

会起作用的。

【讨论】:

    【解决方案2】:

    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 数组没有计算矩阵逆矩阵的方法,但您可以使用 numpy.linalg.inv 轻松做到这一点,就像您已经根据代码示例尝试过的那样。

    【讨论】:

      【解决方案3】:

      我建议更改所有这些导入:

      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) 有效。

      【讨论】:

        猜你喜欢
        • 2019-05-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多