Обратная матрица с десятичным типом NumPy

У меня есть пара таких матриц:

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

Да, это десятичный. Десятичный тип.

Тогда я хочу, чтобы это было наоборот:

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] ...

Как видите, значения были преобразованы в значения с плавающей запятой. Я понимаю, что десятичное число не поддерживается по умолчанию, но тем не менее Мне нужен способ выполнить эту работу с десятичным типом для точности.


person gerosalesc    schedule 20.09.2015    source источник
comment
Мне не кажется, что точность является значимой характеристикой для обратной матрицы. Сколько цифр вы хотите использовать? Что заставляет вас думать, что обратное можно точно представить таким образом?   -  person Brent Bradburn    schedule 21.09.2015
comment
@nobar конечной целью этой операции является вычисление коэффициентов уравнения 3-го класса, и у меня есть требование, чтобы эти коэффициенты были как можно более точными, и я определил 24 десятичных разряда для моего класса Decimal, обеспечивает ли поплавок двойной точности эта точность?   -  person gerosalesc    schedule 21.09.2015
comment
Я неправильно понял, что вы имели в виду под точностью. Я думал, вам нужно меньше цифр, но идеальная точность (что является одной из особенностей decimal< /а>). Кстати, вот некоторые мысли о точности numpy.float128: Какова внутренняя точность numpy.float128?   -  person Brent Bradburn    schedule 21.09.2015


Ответы (1)


К сожалению, нет способа заставить 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, возможно, формат расширенной точности (80-битная с плавающей запятой)

person benbo    schedule 20.09.2015
comment
какую точность обеспечивает float64? Можете ли вы предоставить небольшой фрагмент того, как конвертировать? - person gerosalesc; 21.09.2015
comment
см. мои правки в ответе. Обратите внимание, что операции с float128 будут медленнее, чем с float64, поэтому убедитесь, что вам действительно нужна такая точность. - person benbo; 21.09.2015