ntype十进制的numpy数组?

时间:2011-10-14 16:47:59

标签: python numpy decimal

Numpy中是否有十进制dtypes?

>>> 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 个答案:

答案 0 :(得分:23)

Numpy不会将decimal.Decimal识别为特定类型。它最接近的是最常见的dtype,object。因此,在将元素转换为所需的dtype时,转换是无操作。

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

请记住,因为数组的元素是Python对象,所以使用它们的速度不会太快。例如,如果您尝试将其添加到任何其他数组,则必须将其他元素装箱回到python对象中,并通过普通的Python添加代码添加。你可能会获得一些速度,因为迭代将在C中,但不是那么多。

答案 1 :(得分:10)

不幸的是,在创建numpy.array时,必须将每个项目转换为Decimal。像

这样的东西
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)

答案 2 :(得分:7)

重要CAVEAT:这是一个不好的答案

所以在我真正明白这一点之前,我回答了这个问题。答案被接受,并有一些赞成,但你可能最好跳到下一个。

原始回答:

似乎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数组更复杂。