ntype十进制的numpy数组?

mat*_*ick 29 python numpy decimal

Nimaly中是否有十进制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'>
Run Code Online (Sandbox Code Playgroud)

我想numpy.array不支持每个dtype,但我认为只要正确的操作被定义,它至少会让dtype尽可能地传播.我错过了什么吗?这有什么办法吗?

AFo*_*lia 23

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

>>> ss.dtype
dtype('object')
Run Code Online (Sandbox Code Playgroud)

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


Ofr*_*viv 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)
Run Code Online (Sandbox Code Playgroud)


Eri*_*son 6

重要的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'>
Run Code Online (Sandbox Code Playgroud)

我不确定你要完成什么,你的例子比简单地创建一个十进制numpy数组更复杂.

  • 你只是在这里用dtype`dtype('object')创建一个数组; NumPy对Decimal类型一无所知. (17认同)
  • 性能差异大约慢了 100 倍:“%timeit(float_arr * 2)”每个循环 1.34 µs,“%timeit(dec_arr * 2)”每个循环 141 µs。(给定 `float_arr = np.array([1.1] * 1000); fromdecimal import Decimal; dec_arr = np.array([Decimal(1.1)] * 1000, dtype=np.dtype(Decimal))`) (3认同)