使用 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
对象上,而不存在于 ndarray
s 上。您可以使用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 逆矩阵的主要内容,如果未能解决你的问题,请参考以下文章
python使用numpy中的np.linalg.det函数计算2D numpy数组的行列式的值使用numpy中的np.linalg.inv函数计算2D numpy数组的逆矩阵