我使用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')