我想使用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
'命令不兼容。有解决方法吗?
我的目标是打印每个可能的数值矩阵组合的INVERSE MATRIX。
答案 0 :(得分:51)
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]])
答案 1 :(得分:10)
另一种方法是使用numpy matrix
class(而不是numpy数组)和I
属性。例如:
>>> m = np.matrix([[2,3],[4,5]])
>>> m.I
matrix([[-2.5, 1.5],
[ 2. , -1. ]])
答案 2 :(得分:7)
使用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
解决奇异矩阵问题:
尝试捕捉奇异矩阵异常并继续前进,直到找到符合先前标准的变换并且也是可逆的。
直觉为什么矩阵反演不能总是这样做;像在奇异矩阵中一样:
想象一下一部老式的高架电影放映机,它通过电影将明亮的光线照射到白墙上。胶片中的像素投影到墙上的像素。
如果我在一个画面上停止胶片投影,你会在墙上看到胶片的像素,我会要求你根据你看到的内容重新制作胶片。你说,这很简单,只需要执行投影的矩阵的反转即可。矩阵的逆是投影的逆转。
现在想象一下,如果投影机损坏了,我在电影前面放了一个扭曲的镜头。现在,多个像素投射到墙上的同一点。我再次问你要用矩阵反转"撤消这个操作。你说:"我不能因为你用镜头失真破坏了信息,我无法回到原来的位置,因为矩阵是奇异的或退化的。"
只有在不丢失信息的情况下才能反转过程,才能将可用于将某些数据转换为其他数据的矩阵进行反转。如果您的矩阵无法反转,也许您使用猜测和检查方法定义您的投影,而不是使用保证无损变换的过程。
如果您正在使用启发式或任何不完美的数学精度,那么您必须定义另一个过程来管理和隔离失真,以便布朗运动的编程可以恢复。
来源:
http://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.inv.html#numpy.linalg.inv
答案 3 :(得分:2)
inv怎么办?
例如为: my_inverse_array = inv(my_array)