Numpy массив с dtype Decimal?
Доступны ли десятичные dtypes в numpy?
>>> import decimal, numpy
>>> d = decimal.Decimal('1.1')
>>> s = [['123.123','23'],['2323.212','123123.21312']]
>>> ss = numpy.array(s, dtype=numpy.dtype(decimal.Decimal))
>>> a = numpy.array(s, dtype=float)
>>> type(d)
<class 'decimal.Decimal'>
>>> type(ss[1,1])
<class 'str'>
>>> type(a[1,1])
<class 'numpy.float64'>
Я полагаю, что numpy.array не поддерживает каждый тип dtype, но я вроде бы думал, что он, по крайней мере, позволит dtype распространяться, насколько это возможно, до тех пор, пока будут определены правильные операции. Я что-то упускаю? Есть ли способ для этого работать?
Ответы
Ответ 1
ВАЖНАЯ ПЕСНЯ: ЭТО НЕПРЕРЫВНЫЙ ОТВЕТ
Поэтому я ответил на этот вопрос, прежде чем я действительно понял его суть. Ответ был принят и имеет некоторые обороты, но вы, вероятно, лучше всего перейдете к следующему.
Оригинальный ответ:
Кажется, что Decimal
доступен:
>>> import decimal, numpy
>>> d = decimal.Decimal('1.1')
>>> a = numpy.array([d,d,d],dtype=numpy.dtype(decimal.Decimal))
>>> type(a[1])
<class 'decimal.Decimal'>
Я не уверен точно, что вы пытаетесь выполнить, ваш пример более сложный, чем это необходимо для простого создания десятичного массива numpy.
Ответ 2
Numpy не распознает decimal.Decimal как определенный тип. Самое близкое, что он может получить, это самый общий объект dtype. Поэтому при преобразовании элементов в требуемый тип dtype преобразование является no-op.
>>> ss.dtype
dtype('object')
Имейте в виду, что поскольку элементы массива являются объектами Python, вы не сможете значительно увеличить их использование. Например, если вы попытаетесь добавить это к любому другому массиву, остальные элементы должны быть помещены в объекты python и добавлены через обычный код добавления Python. Вы можете получить некоторую скорость в том, что итерация будет в C, но не так много.
Ответ 3
К сожалению, при создании numpy.array вы должны отбросить каждый из своих элементов до десятичного. Что-то вроде
s = [['123.123','23'],['2323.212','123123.21312']]
decimal_s = [[decimal.Decimal(x) for x in y] for y in s]
ss = numpy.array(decimal_s)