【问题标题】:Inverse of a matrix using numpy使用 numpy 逆矩阵
【发布时间】:2014-03-05 12:32:52
【问题描述】:

我想使用 numpy 来计算逆。但我收到一个错误:

'numpy.ndarry' object has no attribute I

要在 numpy 中计算矩阵的逆矩阵,比如矩阵 M,它应该很简单: print M.I

代码如下:

x = numpy.empty((3,3), dtype=int)
for comb in combinations_with_replacement(range(10), 9):
   x.flat[:] = comb
   print x.I

我猜,这个错误是因为 x 现在是平的,因此“I”命令不兼容。有解决办法吗?

我的目标是打印每个可能的数字矩阵组合的逆矩阵。

【问题讨论】:

  • 也对另一个答案发表了评论,但您必须将 x 定义为矩阵 np.matrix(x) 以便 .I 方法可用。

标签: python numpy matrix


【解决方案1】:

I 属性仅存在于 matrix 对象上,而不存在于 ndarrays 上。您可以使用numpy.linalg.inv 来反转数组:

inverse = numpy.linalg.inv(x)

请注意,您生成矩阵的方式并非所有矩阵都是可逆的。您要么需要更改生成矩阵的方式,要么跳过不可逆的矩阵。

try:
    inverse = numpy.linalg.inv(x)
except numpy.linalg.LinAlgError:
    # Not invertible. Skip this one.
    pass
else:
    # continue with what you were doing

此外,如果您想遍历所有元素从 [0, 10) 中提取的 3x3 矩阵,您需要以下内容:

for comb in itertools.product(range(10), repeat=9):

而不是combinations_with_replacement,否则你会跳过类似的矩阵

numpy.array([[0, 1, 0],
             [0, 0, 0],
             [0, 0, 0]])

【讨论】:

  • 'Module' 对象没有属性 inv ... =/
  • 是的,我试过了,我得到了“奇异矩阵”错误。 O_O
  • @JakeZ:那是因为您正在尝试反转不可逆矩阵。例如,您生成的矩阵之一是 0 矩阵。
  • 太棒了!我完全忘了检查奇异矩阵-_-'哈哈,谢谢。像魅力一样工作。
  • @anu:这是一个线性代数问题,而不是编程问题。作为线性代数,你的第一个矩阵是可逆的,而你的其他两个不是。没有理由期望所有方阵都有逆矩阵。
【解决方案2】:

另一种方法是使用numpy matrix class(而不是numpy数组)和I属性。例如:

>>> m = np.matrix([[2,3],[4,5]])
>>> m.I
matrix([[-2.5,  1.5],
       [ 2. , -1. ]])

【讨论】:

【解决方案3】:

使用 python 和 numpy 逆矩阵:

>>> import numpy as np
>>> b = np.array([[2,3],[4,5]])
>>> np.linalg.inv(b)
array([[-2.5,  1.5],
       [ 2. , -1. ]])

并非所有矩阵都可以倒置。例如singular matrices are not Invertable:

>>> import numpy as np
>>> b = np.array([[2,3],[4,6]])
>>> np.linalg.inv(b)

LinAlgError: Singular matrix

奇异矩阵问题的解法:

尝试捕获奇异矩阵异常并继续前进,直到找到满足先前条件并且也是可逆的变换。

【讨论】:

    【解决方案4】:

    inv 呢?

    例如: my_inverse_array = inv(my_array)

    【讨论】:

    • 我试过了,但我得到了“奇异矩阵”错误……很可能是因为它变平了……我想知道是否有办法将其重塑回原来的状态然后反转它?
    • 将它的原始状态存储起来然后再引用它可能更容易,就像一个包含当前状态和一个说明它最初状态的属性的对象一样。 numpy.linalg.lstsq 将尝试为您提供最小二乘解决方案,但我不知道有什么特别干净的。
    猜你喜欢
    • 2012-05-12
    • 2015-11-13
    • 2014-03-17
    • 1970-01-01
    • 2013-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-27
    相关资源
    最近更新 更多