Это не полный ответ, но он может указать вам правильное направление. Что вам действительно нужно, так это массивы numpy, которые используют десятичные числа для математики. Вы можете разумно подумать, чтобы попробовать:
import numpy as np
from decimal import Decimal
A = np.array([[2,2],[4,-1]],np.int)
for i, a in np.ndenumerate(A):
A[i] = Decimal(a)
print type(A[i])
Но, увы, Decimals не входит в число типов данных, поддерживаемых "из коробки" в numpy, поэтому каждый раз, когда вы пытаетесь вставить Decimal в массив, он повторно преобразует его в число с плавающей запятой.
Одной из возможностей было бы установить тип данных, таким образом:
def decimal_array(arr):
X = np.array(arr, dtype = Decimal)
for i, x in np.ndenumerate(X): X[i] = Decimal(x)
return X
A = decimal_array([[2,2],[4,-1]])
B = decimal_array([[1,3],[-1,-1]])
A = A.transpose()
B = B.transpose()
Binv = np.linalg.inv(B) #calculate the inverse
Но теперь, если вы
print Binv.dtype
вы увидите, что инверсия преобразовала его обратно в плавающий. Причина в том, что linalg.inv (как и многие другие функции) ищет "common_type" B, который является скаляром, к которому, по ее мнению, он может принудить элементы вашего массива.
Хотя, возможно, это не безнадежно. Я посмотрел, сможете ли вы решить эту проблему, создав собственный тип dtype, но оказалось, что скаляры (целые числа, числа с плавающей запятой и т. д.) вообще не являются типами dtype. Вместо этого вы, вероятно, захотите зарегистрировать новый скаляр — это Decimal — как указано в файле статья о скалярах. Вы увидите ссылку на Numpy C-API (не бойтесь). Найдите на странице слова «регистрация» и «скаляр», чтобы начать.
person
rcs
schedule
03.07.2014