使用numpy逆矩阵


74

我想用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'命令不兼容。有没有解决的办法?

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


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

Answers:


96

I属性仅存在于matrix对象上,不存在ndarray。您可以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]])

“模块”对象没有属性inv ... = /
Jake Z

是的,我尝试过,但出现“奇异矩阵”错误。O_O
Jake Z

3
@JakeZ:那是因为您试图反转不可逆矩阵。例如,您要生成的矩阵之一是0矩阵。
user2357112支持Monica 2014年

惊人!我完全忘了检查奇异矩阵-_-'哈哈,谢谢。像魅力一样运作。
2014年

1
@anu:这是线性代数问题,而不是编程问题。就线性代数而言,您的第一个矩阵是可逆的,而其他两个矩阵则不是。没有理由期望所有平方矩阵都有逆。
user2357112支持莫妮卡

17

执行此操作的另一种方法是使用numpymatrix(而不是numpy数组)和I属性。例如:

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

我宁愿使用这种方法,因为它更直接。但是它们两者的工作原理完全相同。
帕萨

尽管方便,但np.matrix正式建议不要使用,因为它会导致np.array用户产生歧义:scipy.linalg
Shahrokh Bah

11

使用python和numpy进行矩阵求逆:

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

并非所有矩阵都可以求逆。例如,奇异矩阵不可逆

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

LinAlgError: Singular matrix

奇异矩阵问题的解决方案:

尝试捕获奇异矩阵异常,并继续进行,直到找到符合先前条件并且也是可逆的转换为止。

为何不能总是进行矩阵求逆的直觉;像在单数矩阵中一样:

想象一下一台旧的高架电影放映机,它通过胶片将明亮的光线照到白墙上。胶片中的像素投影到墙上的像素。

如果将胶片投影停止在一个帧上,您将在墙上看到胶片的像素,请您根据看到的内容重新生成胶片。您说这很容易,只要对执行投影的矩阵求逆即可。矩阵的逆是投影的反转。

现在想象一下放映机是否损坏,我在电影的前面放了一个变形的镜头。现在,多个像素被投影到墙上的同一位置。我再次要求您“使用矩阵逆函数撤消此操作”。你说:“我不能因为你因为镜头畸变而破坏了信息,我不能回到原来的状态,因为矩阵要么是奇异的要么是退化的。”

仅当可以逆转过程而不会丢失信息时,可用于将某些数据转换为其他数据的矩阵才是可逆的。如果矩阵不能反转,则可能是使用猜测和检查方法而不是使用保证无损转换的过程定义投影。

如果您使用的是启发式算法或不尽人意的数学精度,则必须定义另一个过程来管理和隔离变形,以便可以恢复通过布朗运动进行的编程。

资源:

http://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.inv.html#numpy.linalg.inv


2

inv呢?

例如:my_inverse_array = inv(my_array)


我尝试过,但是出现“奇异矩阵”错误……很可能是因为它变平了……。我想知道是否有办法将其重塑回其原始状态然后反转?
2014年

像存储当前状态和表明其原始状态的属性那样,将其原始状态存储起来然后再回引用它可能会更容易。numpy.linalg.lstsq将尝试为您提供最小二乘解法,但我不知道有什么特别干净的方法。
user1330052
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.