python中Decimal矩阵运算怎么处理

问题遇到的现象和发生背景

我使用decimal运算,保留50位小数,存储到一个二位数组,然后将二位数组传入得np.linalg.inv()函数中进行矩阵求逆,出现了
No loop matching the specified signature and casting was found for ufunc inv错误,有什么好得解决方式

运行结果及报错内容

这是生成得数组:
[[Decimal('-4.8862271584128455294289331030555893791746173867389E-17'), Decimal('1.5533333333333336782426196502153272777422355893436E-13'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0')], [Decimal('1.5533333333333336782426196502153272777422355893436E-13'), Decimal('-4.8862271584128455294289331030555893791746173867389E-17'), Decimal('1.5533333333333336782426196502153272777422355893436E-13'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0')], [Decimal('0'), Decimal('1.5533333333333336782426196502153272777422355893436E-13'), Decimal('-4.8862271584128455294289331030555893791746173867389E-17'), Decimal('1.5533333333333336782426196502153272777422355893436E-13'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0')], [Decimal('0'), Decimal('0'), Decimal('1.5533333333333336782426196502153272777422355893436E-13'), Decimal('-4.8862271584128455294289331030555893791746173867389E-17'), Decimal('1.5533333333333336782426196502153272777422355893436E-13'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0')], [Decimal('0'), Decimal('0'), Decimal('0'), Decimal('1.5533333333333336782426196502153272777422355893436E-13'), Decimal('-4.8862271584128455294289331030555893791746173867389E-17'), Decimal('1.5533333333333336782426196502153272777422355893436E-13'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0')], [Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('1.5533333333333336782426196502153272777422355893436E-13'), Decimal('-4.8862271584128455294289331030555893791746173867389E-17'), Decimal('1.5533333333333336782426196502153272777422355893436E-13'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0')], [Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('1.5533333333333336782426196502153272777422355893436E-13'), Decimal('-4.8862271584128455294289331030555893791746173867389E-17'), Decimal('1.5533333333333336782426196502153272777422355893436E-13'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0')], [Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('1.5533333333333336782426196502153272777422355893436E-13'), Decimal('-4.8862271584128455294289331030555893791746173867389E-17'), Decimal('1.5533333333333336782426196502153272777422355893436E-13'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0')], [Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('1.5533333333333336782426196502153272777422355893436E-13'), Decimal('-4.8862271584128455294289331030555893791746173867389E-17'), Decimal('1.5533333333333336782426196502153272777422355893436E-13'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0')], [Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('1.5533333333333336782426196502153272777422355893436E-13'), Decimal('-4.8862271584128455294289331030555893791746173867389E-17'), Decimal('1.5533333333333336782426196502153272777422355893436E-13'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0')], [Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('1.5533333333333336782426196502153272777422355893436E-13'), Decimal('-4.8862271584128455294289331030555893791746173867389E-17'), Decimal('1.5533333333333336782426196502153272777422355893436E-13'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0')], [Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('1.5533333333333336782426196502153272777422355893436E-13'), Decimal('-4.8862271584128455294289331030555893791746173867389E-17'), Decimal('1.5533333333333336782426196502153272777422355893436E-13'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0')], [Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('1.5533333333333336782426196502153272777422355893436E-13'), Decimal('-4.8862271584128455294289331030555893791746173867389E-17'), Decimal('1.5533333333333336782426196502153272777422355893436E-13'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0')], [Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('1.5533333333333336782426196502153272777422355893436E-13'), Decimal('-4.8862271584128455294289331030555893791746173867389E-17'), Decimal('1.5533333333333336782426196502153272777422355893436E-13'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0')], [Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('1.5533333333333336782426196502153272777422355893436E-13'), Decimal('-4.8862271584128455294289331030555893791746173867389E-17'), Decimal('1.5533333333333336782426196502153272777422355893436E-13'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0')], [Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('1.5533333333333336782426196502153272777422355893436E-13'), Decimal('-4.8862271584128455294289331030555893791746173867389E-17'), Decimal('1.5533333333333336782426196502153272777422355893436E-13'), Decimal('0'), Decimal('0'), Decimal('0')], [Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('1.5533333333333336782426196502153272777422355893436E-13'), Decimal('-4.8862271584128455294289331030555893791746173867389E-17'), Decimal('1.5533333333333336782426196502153272777422355893436E-13'), Decimal('0'), Decimal('0')], [Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('1.5533333333333336782426196502153272777422355893436E-13'), Decimal('-4.8862271584128455294289331030555893791746173867389E-17'), Decimal('1.5533333333333336782426196502153272777422355893436E-13'), Decimal('0')], [Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('1.5533333333333336782426196502153272777422355893436E-13'), Decimal('-4.8862271584128455294289331030555893791746173867389E-17'), Decimal('1.5533333333333336782426196502153272777422355893436E-13')], [Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('0'), Decimal('1.5533333333333336782426196502153272777422355893436E-13'), Decimal('-4.8862271584128455294289331030555893791746173867389E-17')]]
错误信息:

Traceback (most recent call last):

  File "D:\project\pacong\chen.py", line 225, in 
    mainExe()

  File "D:\project\pacong\chen.py", line 123, in mainExe
    AccZZ = inv(AccZF)

  File "<__array_function__ internals>", line 5, in inv

  File "D:\tools1\Anaconda3\lib\site-packages\numpy\linalg\linalg.py", line 545, in inv
    ainv = _umath_linalg.inv(a, signature=signature, extobj=extobj)

TypeError: No loop matching the specified signature and casting was found for ufunc inv
我的解答思路和尝试过的方法

我试过将值转换成string,尝试其他类型,但是其他类型无法存储50位小数

np.linalg.inv函数接受浮点型和整形参数,将decimal.Decimal类型的列表当作参数,肯定出错。如果先将decimal.Decimal类型的列表转为np.float64类型,就不错报错了,不过np.float64只有52位尾数,最高精度大约是小数点后17位(1/pow(2, 52)),肯定无法满足题主要求。

from decimal import *
import numpy as np
a = np.array([Decimal('0.1'), Decimal('0.2')], dtype=np.float64) # 需要指定类型
a.dtype
dtype('float64')
a = np.array([Decimal('0.1'), Decimal('0.2')]) # 否则,就是object类型。这就是题主出错的原因
a.dtype
dtype('O')