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

rro*_*ndd 29 python math numpy

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

>>> import numpy as np
>>> bool(np.nan)
True
Run Code Online (Sandbox Code Playgroud)

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

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

NPE*_*NPE 24

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

In [1]: bool(float('nan'))
Out[1]: True
Run Code Online (Sandbox Code Playgroud)

这些规则在文档中有详细说明.

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

  • TL;DR 对于链接文档:Python 将所有内容视为“True”,除非它是专门定义的错误情况之一(例如,“None”、“False”、数字零、空序列、返回 1 的“用户定义”类)其中,等等)。 (2认同)

ice*_*ime 7

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

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

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