为什么“Not a Number”值在Python/Numpy中转换为布尔值时等于True?

mec1mxoz  于 11个月前  发布在  Python
关注(0)|答案(6)|浏览(146)

当将NumPy Not-a-Number值转换为布尔值时,它将变为True,例如如下所示。

>>> import numpy as np
>>> bool(np.nan)
True

字符串
这与我的直觉预期完全相反。这种行为背后有一个合理的原则吗?
(我怀疑可能有同样的行为似乎发生在八度。

dgsult0t

dgsult0t1#

这绝不是NumPy-specific的,但与Python处理NaN的方式是一致的:

In [1]: bool(float('nan'))
Out[1]: True

字符串
这些规则在文档中有详细说明。
我认为可以合理地论证NaN的真值应该是False。然而,这不是目前该语言的工作方式。

r7knjye2

r7knjye22#

Python真值测试表明,以下值被认为是False

  • 任何数字类型的零,例如0,0L,0.0,0j。

Numpy可能选择坚持这种行为,并防止NaN在布尔上下文中计算为False。但是请注意,您可以使用numpy.isnan来测试NaN。

lnxxn5zx

lnxxn5zx3#

0.0是唯一一个错误的浮点值,因为这是语言设计者认为最有用的。Numpy只是沿着。(当bool(float('nan'))True时,让bool(np.nan)成为False会很奇怪)。
我认为这可能是因为这就是整数的工作方式。诚然,整数没有NaN或inf类型的值,但我认为特殊情况还没有特殊到违反规则。

1rhkuytd

1rhkuytd4#

Numpy遵循python的真值测试标准,任何数值类型的计算结果都是False,当且仅当其数值为零。
请注意,使用NaN值进行真值测试在其他方面也可能不直观(例如,nan == nan计算为False)。

yqyhoc1h

yqyhoc1h5#

这通常是在测试np.nan的变数时所需要的。当np.nan is not np.nan失败(评估为False)时,np.isnan函数会运作(评估为True,因此可用来测试np.nan):
np.isnan(np.nan)

ua4mk5z4

ua4mk5z46#

您可以使用np.isnan(foo)对NumPynan值进行布尔检查。

In [1]: np.isnan(np.nan)
Out[1]: True

In [1]: not np.isnan(np.nan)
Out[1]: False

字符串
https://numpy.org/doc/stable/reference/generated/numpy.isnan.html

相关问题