Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

numpy array with dtype Decimal?

Are Decimal data type objects (dtypes) available in 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'>

I suppose numpy.array doesn't support every dtype, but I sort of thought that it would at least let a dtype propagate as far as it could as long as the right operations were defined. Am I missing something? Is there some way for this to work?

like image 364
mathtick Avatar asked Oct 14 '11 16:10

mathtick


People also ask

Can NumPy array store decimals?

NumPy doesn't recognize decimal. Decimal as a specific type.

How do I assign a Dtype to a NumPy array?

We have a method called astype(data_type) to change the data type of a numpy array. If we have a numpy array of type float64, then we can change it to int32 by giving the data type to the astype() method of numpy array. We can check the type of numpy array using the dtype class.


3 Answers

NumPy doesn't recognize decimal.Decimal as a specific type. The closest it can get is the most general dtype, object. So when converting the elements to the desired dtype, the conversion is a no operation.

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

Keep in mind that because the elements of the array are Python objects, you won't get much of a speedup using them. For example, if you try to add this to any other array, the other elements will have to be boxed back into Python objects and added via the normal Python addition code. You might gain some speed in that the iteration will be in C, but not that much.

like image 141
AFoglia Avatar answered Oct 17 '22 20:10

AFoglia


Unfortunately, you have to cast each of your items to Decimal when you create the numpy.array. Something like

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)
like image 43
Ofri Raviv Avatar answered Oct 17 '22 21:10

Ofri Raviv


Important caveat: this is a bad answer

You would probably do best to skip to the next answer.


It seems that Decimal is available:

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

I'm not sure exactly what you are trying to accomplish. Your example is more complicated than is necessary for simply creating a decimal NumPy array.

like image 45
Eric Wilson Avatar answered Oct 17 '22 22:10

Eric Wilson