当将NumPy Not-a-Number值转换为布尔值时,它变为True,例如如下。
>>> import numpy as np
>>> bool(np.nan)
True
这与我直觉所期望的完全相反。这种行为是否存在合理的原则?
(我怀疑在Octave中可能会出现相同的行为。)
答案 0 :(得分:22)
这绝不是NumPy特有的,但与Python对待NaN的方式一致:
In [1]: bool(float('nan'))
Out[1]: True
规则在documentation中列出。
我认为可以合理地认为NaN的真值应该是假的。但是,这不是语言现在的工作方式。
答案 1 :(得分:7)
Python truth-value testing声明以下值被视为False
:
- 任何数字类型的零,例如,0,0L,0.0,0j。
Numpy可能选择坚持这种行为并阻止NaN在布尔上下文中评估False
。但请注意,您可以使用numpy.isnan
来测试NaN。
答案 2 :(得分:3)
0.0
是唯一的假浮动值,因为这是语言设计者认为最有用的。 Numpy只是顺着而已。 (bool(np.nan)
为False
时bool(float('nan'))
为True
会很奇怪。
我认为这可能是因为这就是整数的运作方式。不可否认,整数没有NaN或inf类型的值,但我认为特殊情况不足以破坏规则。
答案 3 :(得分:2)
Numpy在此处python standard for truth testing之后,当且仅当其数值为零时,任何数字类型的计算结果为False
。
请注意,NaN
值的真值测试在其他方面也可能不直观(例如,nan == nan
评估为False
)。