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尽可能地传播。我错过了什么吗?有没有办法让这个工作?
答案 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数组更复杂。