Jak*_*e Z 51 python numpy matrix
我想使用numpy来计算逆.但我收到一个错误:
'numpy.ndarry' object has no attribute I
Run Code Online (Sandbox Code Playgroud)
要计算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
Run Code Online (Sandbox Code Playgroud)
我假设发生此错误是因为x现在是平的,因此' I'命令不兼容.有没有解决这个问题?
我的目标是打印每个可能的数值矩阵组合的INVERSE MATRIX.
use*_*ica 63
该I属性仅存在于matrix对象上,而不是ndarrays.您可以使用numpy.linalg.inv反转数组:
inverse = numpy.linalg.inv(x)
Run Code Online (Sandbox Code Playgroud)
请注意,您生成矩阵的方式并非所有矩阵都是可逆的.您将需要更改生成矩阵的方式,或跳过那些不可逆的矩阵.
try:
inverse = numpy.linalg.inv(x)
except numpy.linalg.LinAlgError:
# Not invertible. Skip this one.
pass
else:
# continue with what you were doing
Run Code Online (Sandbox Code Playgroud)
此外,如果要浏览所有使用[0,10]绘制的元素的3x3矩阵,您需要以下内容:
for comb in itertools.product(range(10), repeat=9):
Run Code Online (Sandbox Code Playgroud)
而不是combinations_with_replacement,或者你会跳过像这样的矩阵
numpy.array([[0, 1, 0],
[0, 0, 0],
[0, 0, 0]])
Run Code Online (Sandbox Code Playgroud)
dag*_*rha 11
另一种方法是使用numpy matrix类(而不是numpy数组)和I属性.例如:
>>> m = np.matrix([[2,3],[4,5]])
>>> m.I
matrix([[-2.5, 1.5],
[ 2. , -1. ]])
Run Code Online (Sandbox Code Playgroud)
使用python和numpy反转矩阵:
>>> import numpy as np
>>> b = np.array([[2,3],[4,5]])
>>> np.linalg.inv(b)
array([[-2.5, 1.5],
[ 2. , -1. ]])
Run Code Online (Sandbox Code Playgroud)
并非所有矩阵都可以反转.例如,奇异矩阵不是可逆的:
>>> import numpy as np
>>> b = np.array([[2,3],[4,6]])
>>> np.linalg.inv(b)
LinAlgError: Singular matrix
Run Code Online (Sandbox Code Playgroud)
奇异矩阵问题的解决方案:
尝试捕获奇异矩阵异常并继续前进,直到找到符合先前标准的变换并且也是可反转的.
矩阵反演的直觉和ELI5以及为什么有时无法完成:
想象一下,一部电影电影放映机将电影上的明亮光线照射到白墙上,浓缩电影中的像素被"投射"到墙上的像素上.
我在一个画面上停止了电影投影,你看到白墙上的像素,我要求你重新投影它的电影.这很简单,只需采用执行投影的矩阵的逆.投影的矩阵反转.
现在想象一下,如果投影机损坏,胶片上的多个像素投射到墙上的同一位置.然后我请你"用矩阵逆撤消这个操作".你说:"我不能,信息在投影中被破坏,我无法回到原来的位置,因为矩阵是奇异的还是退化的."
只有在不丢失信息的情况下才能反转过程,用于将数据转换为其他数据的矩阵才是可逆的.如果您的矩阵不能被反转,也许您使用猜测和检查方法定义您的投影,而不是使用保证非破坏性变换的过程.
资源:
http://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.inv.html#numpy.linalg.inv