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

时间:2013-03-28 15:49:04

标签: python math numpy

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

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

这与我直觉所期望的完全相反。这种行为是否存在合理的原则?

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

4 个答案:

答案 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)Falsebool(float('nan'))True会很奇怪。

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

答案 3 :(得分:2)

Numpy在此处python standard for truth testing之后,当且仅当其数值为零时,任何数字类型的计算结果为False

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