48

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

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

这与我的直觉预期完全相反。这种行为背后是否有合理的原则?

(我怀疑在 Octave 中可能会出现相同的行为。)

4

4 回答 4

31

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

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

规则在文档中有详细说明。

我认为可以合理地认为 NaN 的真值应该是 False。但是,这不是该语言现在的工作方式。

于 2013-03-28T15:55:52.897 回答
7

Python真值测试表明考虑了以下值False

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

Numpy 可能选择坚持这种行为并阻止 NaNFalse在布尔上下文中评估 to。但是请注意,您可以使用它numpy.isnan来测试 NaN。

于 2013-03-28T15:54:03.063 回答
3

0.0是唯一虚假的浮点值,因为这是语言设计者认为最有用的值。Numpy 只是跟随。bool(np.nan)(如果是Falsewhen bool(float('nan'))is会很奇怪True)。

我认为这可能是因为这就是整数的工作方式。诚然,整数没有 NaN 或 inf 类型的值,但我认为特殊情况还不足以打破规则。

于 2013-03-28T15:51:17.137 回答
2

Numpy 在此处遵循python 标准进行真值测试,任何数字类型的计算结果为False当且仅当其数值为零时。

请注意,使用NaN值进行真值测试在其他方面也可能不直观(例如,nan == nan评估为False)。

于 2013-03-28T15:55:39.367 回答