当将 NumPy Not-a-Number 值转换为布尔值时,它变为 True,例如如下所示。
>>> import numpy as np
>>> bool(np.nan)
True
这与我的直觉预期完全相反。这种行为背后是否有合理的原则?
(我怀疑在 Octave 中可能会出现相同的行为。)
这绝不是 NumPy 特有的,但与 Python 处理 NaN 的方式一致:
In [1]: bool(float('nan'))
Out[1]: True
规则在文档中有详细说明。
我认为可以合理地认为 NaN 的真值应该是 False。但是,这不是该语言现在的工作方式。
Python真值测试表明考虑了以下值False
:
- 任何数字类型的零,例如 0、0L、0.0、0j。
Numpy 可能选择坚持这种行为并阻止 NaNFalse
在布尔上下文中评估 to。但是请注意,您可以使用它numpy.isnan
来测试 NaN。
0.0
是唯一虚假的浮点值,因为这是语言设计者认为最有用的值。Numpy 只是跟随。bool(np.nan)
(如果是False
when bool(float('nan'))
is会很奇怪True
)。
我认为这可能是因为这就是整数的工作方式。诚然,整数没有 NaN 或 inf 类型的值,但我认为特殊情况还不足以打破规则。
Numpy 在此处遵循python 标准进行真值测试,任何数字类型的计算结果为False
当且仅当其数值为零时。
请注意,使用NaN
值进行真值测试在其他方面也可能不直观(例如,nan == nan
评估为False
)。