【问题标题】:numpy array with dtype Decimal?带有dtype Decimal的numpy数组?
【发布时间】:2011-12-07 22:10:45
【问题描述】:

numpy 中是否提供 Decimal 数据类型?

>>> 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 传播尽可能远。我错过了什么吗?有什么方法可以解决这个问题吗?

【问题讨论】:

  • 在我写这篇文章的时候,下面有三个答案,都很有用。我已将其中一项标记为正确。根据您的需要,您似乎可以首先将数组“转换”为 dtype=float 然后 dtype=Decimal 并且它将正常运行。如果您需要从字符串转换为十进制,那么我认为这是需要的元素转换。
  • 在阅读所有内容之前,问问自己“我是否真的需要超过 10 位数的精度?”。如果不是,float64 很好,您可以避免大多数解决方法,正如这里强调的那样,您将充分利用 numpy。

标签: python numpy decimal


【解决方案1】:

重要提示:这是一个错误的答案

所以在我真正理解这个问题之前,我就回答了这个问题。答案已被接受,并且有一些赞成票,但您可能最好跳到下一个。

原答案:

好像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 数组所必需的复杂。

【讨论】:

  • 你只是在这里创建了一个 dtype dtype('object') 的数组; NumPy 不知道 Decimal 类型有什么特别之处。
  • 性能差异大约慢了 100 倍:%timeit(float_arr * 2) 1.34 µs 每循环,%timeit(dec_arr * 2) 141 µs 每循环。 (给定float_arr = np.array([1.1] * 1000); from decimal import Decimal; dec_arr = np.array([Decimal(1.1)] * 1000, dtype=np.dtype(Decimal))
  • 附注使用 numpy==1.10.4
【解决方案2】:

不幸的是,当您创建 numpy.array 时,您必须将每个项目转换为十进制。类似的东西

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)

【讨论】:

    【解决方案3】:

    Numpy 无法将 decimal.Decimal 识别为特定类型。它可以得到的最接近的是最通用的dtype,object。因此,当将元素转换为所需的 dtype 时,转换是无操作的。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-13
      • 2021-10-25
      • 2015-11-01
      • 1970-01-01
      相关资源
      最近更新 更多