使用 numpy 逆矩阵

Posted

技术标签:

【中文标题】使用 numpy 逆矩阵【英文标题】:Inverse of a matrix using 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 方法可用。 【参考方案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. ]])

【讨论】:

我更喜欢这种方法,因为它更直接。但它们的工作原理完全相同。 虽然方便,但官方不鼓励使用np.matrix,因为它会导致np.array 用户的歧义:scipy.linalg 它也被弃用了:numpy.org/devdocs/reference/generated/…【参考方案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 将尝试为您提供最小二乘解决方案,但我不知道有什么特别干净的。

以上是关于使用 numpy 逆矩阵的主要内容,如果未能解决你的问题,请参考以下文章

numpy求两个矩阵中不同元素的个数

numpy奇异值分解,广义逆矩阵与行列式

numpy linalg模块

numpy linalg模块

python使用numpy中的np.linalg.det函数计算2D numpy数组的行列式的值使用numpy中的np.linalg.inv函数计算2D numpy数组的逆矩阵

使用numpy求解Zoepritz 方程矩阵伪逆时报错: SVD did not converge