【问题标题】:how to check for np.nan in list comprehension?如何在列表理解中检查 np.nan?
【发布时间】:2018-02-07 01:08:00
【问题描述】:

我有一个函数应该返回一个整数元组或 np.nan。

return tuple(int(round(n)) if n is not np.nan else n for n in r)

代码对我来说看起来不错,但我收到以下错误,我不知道出了什么问题。

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-7-368ab2ecd3f3> in <module>()
      6 warnings.filterwarnings("ignore") #ignore numpy warnings
      7 for k,v in bb_mapping.items():
----> 8     print(k, map_overview(v))

<ipython-input-2-6f1dc6e291ee> in map_overview(map_tuples)
    120 
    121     r = (np.mean(bb_len), np.std(bb_len), np.mean(ins_len), np.std(ins_len))
--> 122     return tuple(int(round(n)) if n is not np.nan else n for n in r)
    123 
    124 def print_sbar(n,m,s='|#.|',size=30,message=''):

<ipython-input-2-6f1dc6e291ee> in <genexpr>(.0)
    120 
    121     r = (np.mean(bb_len), np.std(bb_len), np.mean(ins_len), np.std(ins_len))
--> 122     return tuple(int(round(n)) if n is not np.nan else n for n in r)
    123 
    124 def print_sbar(n,m,s='|#.|',size=30,message=''):

ValueError: cannot convert float NaN to integer

如果我在将 np.nan 值转换为整数之前显式检查它们,我怎么会得到这个错误?

很奇怪,如果我手动检查返回码,列表解析会按预期工作:

>>> print(tuple(int(round(n)) if n is not np.nan else n for n in [12.6,np.nan,0.5,4.6]))
(13, nan, 0, 5)

我在这里错过了什么?

【问题讨论】:

    标签: python-3.x list-comprehension nan


    【解决方案1】:

    你为什么要和is比较?不同的值不一定是同一个实例。对于整数和浮点数都是如此。 (CPython 对小整数的怪癖是我所知道的唯一例外,并且严格来说是一个实现细节。)

    >>> import math
    >>> float('nan') is math.nan
    False
    

    您可以使用np.isnan 来检查nan,或者内置的math.isnan,或者检查该值是否等于自身。

    >>> np.isnan([12.6,np.nan,0.5,4.6])
    array([False,  True, False, False], dtype=bool)
    >>> [math.isnan(x) for x in [12.6,np.nan,0.5,4.6]]
    [False, True, False, False]
    >>> [x for x in [12.6,np.nan,0.5,4.6] if x == x]
    [12.6, 0.5, 4.6]
    

    【讨论】:

    • 我确信np.nan 只会被实例化一次并且is 是检查它的正确方法。感谢您的提示,它解决了我的问题。
    猜你喜欢
    • 1970-01-01
    • 2021-12-11
    • 2014-06-17
    • 1970-01-01
    • 2018-08-21
    • 1970-01-01
    • 2018-08-13
    • 2019-07-10
    • 1970-01-01
    相关资源
    最近更新 更多