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

3 ответов


ВАЖНОЕ ПРЕДОСТЕРЕЖЕНИЕ: ЭТО ПЛОХОЙ ОТВЕТ

Так я ответил на этот вопрос, прежде чем я действительно понял это. Ответ был принят и имеет некоторые upvotes, но вы, вероятно, лучше всего перейти к следующему.

оригинальный ответ:

Кажется,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.


Numpy не распознает decimal.Decimal как определенный тип. Самое близкое, что он может получить, - это самый общий dtype, object. Поэтому при преобразовании элементов в желаемый dtype преобразование является no-op.

>>> ss.dtype
dtype('object')

имейте в виду, что, поскольку элементы массива являются объектами Python, вы не получите большую скорость их использования. Например, если вы попытаетесь добавить это в любой другой массив, другие элементы должны будут быть упакованы обратно в объекты python и добавлены через обычный код добавления Python. Вы можете получить некоторую скорость в том, что итерация будет в C, но не так много.


к сожалению, при создании numpy вы должны привести каждый из ваших элементов к десятичной дроби.матрица. Что-то вроде

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)