Python Numpy矩阵与其相乘';s inv

Python Numpy矩阵与其相乘';s inv,python,numpy,matrix,floating-point,Python,Numpy,Matrix,Floating Point,如果这是个愚蠢的问题,请原谅。 我只是在Pythonshell中探索numpy,我运行了以下几行代码 >>> from numpy.linalg import inv >>> from numpy import dot, transpose >>> a = np.matrix('1,2;3,4') >>> print a [[1 2] [3 4]] >>> print inv(a) [[-2. 1.

如果这是个愚蠢的问题,请原谅。 我只是在Pythonshell中探索numpy,我运行了以下几行代码

>>> from numpy.linalg import inv
>>> from numpy import dot, transpose
>>> a = np.matrix('1,2;3,4')
>>> print a
[[1 2]
 [3 4]]
>>> print inv(a)
[[-2.   1. ]
 [ 1.5 -0.5]]
>>> print a.dot(inv(a))
[[1.0000000e+00 0.0000000e+00]
 [8.8817842e-16 1.0000000e+00]]
在最后一行中,我期望值

[[1,0]
 [0,1]] 

(单位矩阵),但是我在(1,0)位置得到了一些非零值。

这是浮点运算的结果,以及与之相关的所有缺点。请参阅,以详细了解发生这种情况的原因

你的结果并不完美,但已经足够接近了,这是关键
inv
当然,它不会计算精确的结果(毕竟它使用数值方法)。相应地,A*A_inv并不完全是单位矩阵,但它足够接近。您可以使用
np.allclose
测试接近度

np.allclose(a * inv(a), np.eye(2))
True

(请注意,
a*b
计算
矩阵
对象的点积。)

这是浮点运算的结果,以及与之相关的所有缺点。请参阅,以详细了解发生这种情况的原因

你的结果并不完美,但已经足够接近了,这是关键
inv
当然,它不会计算精确的结果(毕竟它使用数值方法)。相应地,A*A_inv并不完全是单位矩阵,但它足够接近。您可以使用
np.allclose
测试接近度

np.allclose(a * inv(a), np.eye(2))
True

(请注意,
a*b
计算
矩阵
对象的点积。)

使用浮点数时,无法获得准确的结果。也许某种规范会起作用。@GarbageCollector发布的问题的第一个答案解释得很好。此外,您不需要在python控制台中使用
print
。总之,
numpy
可以简化表达式并只返回相同秩的标识矩阵。它还可以加快大型矩阵的运算速度。@Ev.Kounis:为此,您需要使用
sympy
,而不是
numpy
。使用浮点数时,您无法获得准确的结果。也许某种规范会起作用。@GarbageCollector发布的问题的第一个答案解释得很好。此外,您不需要在python控制台中使用
print
。总之,
numpy
可以简化表达式并只返回相同秩的标识矩阵。它还可以加快大型矩阵的速度。@Ev.Kounis:为此,您需要使用
sympy
,而不是
numpy