web-dev-qa-db-fra.com

tableau numpy avec dtype Decimal?

Les dtypes décimaux sont-ils disponibles en 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'>

Je suppose que numpy.array ne prend pas en charge tous les dtype, mais je pensais en quelque sorte qu'il laisserait au moins un dtype se propager aussi loin qu'il le pourrait tant que les bonnes opérations étaient définies. Suis-je en train de manquer quelque chose? Y a-t-il un moyen pour que cela fonctionne?

29
mathtick

CAVEAT IMPORTANT: CECI IS UNE MAUVAISE RÉPONSE

J'ai donc répondu à cette question avant de vraiment en comprendre le sens. La réponse a été acceptée et comporte quelques votes positifs, mais vous feriez probablement mieux de passer à la suivante.

Réponse originale:

Il semble que Decimal soit disponible:

>>> 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'>

Je ne sais pas exactement ce que vous essayez d'accomplir, votre exemple est plus compliqué qu'il n'est nécessaire pour créer simplement un tableau numpy décimal.

6
Eric Wilson

Numpy ne reconnaît pas decimal.Decimal comme type spécifique. Le plus proche qu'il peut obtenir est l'objet dtype le plus général. Ainsi, lors de la conversion des éléments vers le type souhaité, la conversion est un no-op.

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

Gardez à l'esprit que, comme les éléments du tableau sont des objets Python, vous n'obtiendrez pas beaucoup de vitesse en les utilisant. Par exemple, si vous essayez d'ajouter ceci à un autre tableau, les autres éléments devront être encadrés dans des objets python et ajoutés via le code d'addition normal Python. Vous pourriez gagner en vitesse dans la mesure où l'itération sera en C, mais pas tant que ça.

23
AFoglia

Malheureusement, vous devez convertir chacun de vos éléments en décimal lorsque vous créez le numpy.array. Quelque chose comme

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)
10
Ofri Raviv