python-3.x - 如何检查列表理解中的 np.nan ?

标签 python-3.x list-comprehension nan

我有一个函数应该返回整数元组或 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)

我在这里缺少什么?

最佳答案

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

>>> 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]

关于python-3.x - 如何检查列表理解中的 np.nan ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45941426/

相关文章:

python - 如果包含列表的列具有来自另一个较大列表的元素,如何输出 bool 值?

python - 设置字符串而系列是 bool 值?

python - 如何 numpy.nan*0=0

python-3.x - 无法使用带有标记为索引的字符串的 loc 进行设置

python - 无法解析网页中不同海报的链接

python - 拆分字符串的最佳方法

opengl - OpenGL 纹理中的 NAN

python - 1**math.nan 和 0j**math.nan 的惊喜

python-3.x - 在Python中写入远程服务器上的文件

python - 如何在特定时间暂停或停止 python 程序(不基于耗时!)