【问题标题】:how do I check decimal.is_nan() for all values in array?如何检查 decimal.is_nan() 数组中的所有值?
【发布时间】:2020-09-16 09:56:57
【问题描述】:

假设我的数组是这样的:

from decimal import Decimal
array = [Decimal(np.nan), Decimal(np.nan), Decimal(0.231411)]

我知道如果类型是float,我可以检查所有值是否都是nan ,如:

np.isnan(array).all()

有没有办法输入Decimal

没有迭代的解决方案会更好。

【问题讨论】:

  • 什么是Decimal?请提供minimal reproducible example
  • @Yatin - 这是来自 decimal 库的 Decimal 类。这是一个内置的。 from decimal import Decimal 这个例子是可重现的。
  • 当然,这是一个迭代,但是:all([i.is_nan() for i in array]).
  • 你有一个列表,为什么要使用numpyDecimal 对象列表? Decimal 表示你有dtype=object,所以迭代是唯一的方法。

标签: python numpy decimal nan


【解决方案1】:

您可以使用 NumPy 的 vectorize 来避免迭代。

In [40]: from decimal import Decimal

In [41]: import numpy as np

In [42]: nums = [Decimal(np.nan), Decimal(np.nan), Decimal(0.231411)]

In [43]: nums
Out[43]: 
[Decimal('NaN'),
 Decimal('NaN'),
 Decimal('0.2314110000000000055830895462349872104823589324951171875')]

In [44]: np.all(np.vectorize(lambda x: x.is_nan())(np.asarray(nums)))
Out[44]: False

In [45]: np.all(np.vectorize(lambda x: x.is_nan())(np.asarray(nums[:-1])))
Out[45]: True

nums 上面的sn-p 中是Decimal 类的实例列表。请注意,您需要将该列表转换为 NumPy 数组。

【讨论】:

    【解决方案2】:

    从我上面的评论中,我意识到这是一个迭代。原因是np.isnan不支持Decimal作为输入类型;因此,我不相信这可以通过广播来完成,而不转换数据类型 - 这意味着潜在的精度损失,这是使用 Decimal 类型的原因。

    此外,正如@juanpa.arrivillaga 所评论的,由于Decimal 对象位于list 中,因此迭代是唯一的方法。此操作不需要 Numpy。

    一种方法是:

    all([i.is_nan() for i in array])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-08-29
      • 1970-01-01
      • 1970-01-01
      • 2016-02-10
      • 1970-01-01
      • 1970-01-01
      • 2021-01-05
      相关资源
      最近更新 更多