Подтвердить что ты не робот

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 распространяться, насколько это возможно, до тех пор, пока будут определены правильные операции. Я что-то упускаю? Есть ли способ для этого работать?

4b9b3361

Ответ 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)