单模矩阵精确逆Python

时间:2015-02-13 18:26:57

标签: python numpy

numpy有一种反转矩阵的方法。然而,我有一个矩阵与大整数条目,矩阵是单模,所以逆也是一个整数矩阵。错误太大只是为了使用numpy用float计算它然后舍入值。有没有办法用整数或任何其他库计算精确的条目?

1 个答案:

答案 0 :(得分:2)

您可以使用sympy

例如,这里是一个numpy整数数组:

In [148]: m = np.array([[10, 11, 0, 0], [9, 10, 0, 0], [100, 0, 20, 3], [-10000, 200, 133, 20]])

In [149]: m
Out[149]: 
array([[    10,     11,      0,      0],
       [     9,     10,      0,      0],
       [   100,      0,     20,      3],
       [-10000,    200,    133,     20]])

确切的决定因素是1,但np.linalg.det()np.linalg.inv()都会引入浮点错误:

In [150]: np.linalg.det(m)
Out[150]: 0.99999999999887024

In [151]: np.linalg.inv(m)
Out[151]: 
array([[  1.00000000e+01,  -1.10000000e+01,  -6.69432763e-16,
          8.92627614e-17],
       [ -9.00000000e+00,   1.00000000e+01,   6.34413157e-16,
         -8.43354404e-17],
       [ -3.25400000e+05,   3.58000000e+05,   2.00000000e+01,
         -3.00000000e+00],
       [  2.16900000e+06,  -2.38630000e+06,  -1.33000000e+02,
          2.00000000e+01]])

从numpy数组中创建一个sympy Matrix对象:

In [156]: import sympy

In [157]: M = sympy.Matrix(m)

In [158]: M
Out[158]: 
Matrix([
[    10,  11,   0,  0],
[     9,  10,   0,  0],
[   100,   0,  20,  3],
[-10000, 200, 133, 20]])

同情心的计算是准确的:

In [159]: M.det()
Out[159]: 1

In [160]: M.inv()
Out[160]: 
Matrix([
[     10,      -11,    0,  0],
[     -9,       10,    0,  0],
[-325400,   358000,   20, -3],
[2169000, -2386300, -133, 20]])

要将逆转换回numpy数组,您可以执行以下操作:

In [185]: Minv = M.inv()

In [186]: minv = np.asarray(Minv).astype(int)

In [187]: minv
Out[187]: 
array([[      10,      -11,        0,        0],
       [      -9,       10,        0,        0],
       [ -325400,   358000,       20,       -3],
       [ 2169000, -2386300,     -133,       20]])

有必要使用astype(int)方法,因为numpy数组没有dtype object

In [188]: np.asarray(Minv)
Out[188]: 
array([[10, -11, 0, 0],
       [-9, 10, 0, 0],
       [-325400, 358000, 20, -3],
       [2169000, -2386300, -133, 20]], dtype=object)

这个结果是一连串的同情整数。

小心转换回numpy:反转中的整数可能大于可以用64位整数表示的整数。