十进制类型 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 位浮点)
我有几个这样的矩阵:
[[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 位浮点)