массив numpy с десятичным типом dtype? - PullRequest
28 голосов
/ 14 октября 2011

Доступны ли десятичные 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 ]

23 голосов
/ 14 октября 2011

Numpy не распознает десятичный. Десятичный как определенный тип.Самый близкий это может быть самый общий объект типа.Таким образом, при преобразовании элементов в желаемый тип d, преобразование не допускается.

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

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

10 голосов
/ 14 октября 2011

К сожалению, вы должны привести каждый из ваших предметов к десятичному числу, когда вы создаете массив 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)
7 голосов
/ 14 октября 2011

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

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

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

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

...