十进制类型 NumPy 的矩阵求逆

Matrix inverse with Decimal type NumPy

我有几个这样的矩阵:

[[Decimal('1') Decimal('1') Decimal('1') Decimal('1')][Decimal('56.44000000000000000') Decimal('57.32000000000000000') Decimal('57.04000000000000000') Decimal('56.48000000000000000')]

是的,那是 decimal.Decimal 类型。

那么我想要它的倒数:

from numpy.linalg.linalg import inv
invs = inv(mymatrix)
print(invs)

[[ -2.07973657e+15  -7.33173736e+13  -5.68628487e+13   6.80363276e+11
    4.51521775e+12   6.50136911e+11   1.12144399e+10  -1.44488244e+10
   -4.87281445e+10   5.24155356e+08] ...

如您所见,这些值已转换为浮点值。我理解 Decimal is not supported out of the box,但我仍然想要一种方法来使用小数类型来实现精度。

不幸的是,无法使 numpy 及其逆运算与 decimal.Decimal 或 cdecimal.Decimal 一起工作。它将始终转换为 float64,因为它无法使用 Decimal 执行该操作。 Numpy 对 Decimal 一无所知,因为数组将其保存为 dtype 对象。

如果你想改变你的 numpy 数组的数据类型,你可以这样调用:

from cdecimal import Decimal
a=np.array([[Decimal('1'),Decimal('1')],[Decimal('1'),Decimal('2')]])
a
>>> array([[Decimal('1'), Decimal('1')],
   [Decimal('1'), Decimal('2')]], dtype=object)
a=a.astype(np.float128)
a
>>> array([[ 1.0,  1.0],
   [ 1.0,  2.0]], dtype=float128)

这将为您提供 C 编译器的 long double 的精度,可能是扩展精度格式(80 位浮点)