NumPy中是否有Decimal类型?

42 投票
3 回答
66653 浏览
提问于 2025-04-17 04:20

在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并不是支持所有的数据类型,但我以为只要定义了正确的操作,它至少会让某种数据类型尽可能地传播下去。我是不是漏掉了什么?有没有办法让它正常工作呢?

3 个回答

16

很遗憾,当你创建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)
35

NumPy不把decimal.Decimal当作一种特定的类型来看待。它能处理的最接近的类型就是最通用的dtype,也就是对象类型。所以当你想把这些元素转换成其他类型时,其实并没有发生什么变化。

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

要记住,因为数组里的元素都是Python对象,所以使用它们并不会让你的程序变得特别快。例如,如果你想把这个数组和其他数组相加,其他数组的元素会被重新包装成Python对象,然后通过普通的Python加法代码来相加。虽然在迭代时可能会有一些速度提升,因为迭代是在C语言中进行的,但提升也不会太大。

7

重要提示:这个答案不太好

你可能最好直接跳到下一个答案。


看起来 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 数组要复杂得多。

撰写回答