“为什么?”;“不是一个数字”;在Python/Numpy中强制转换为布尔值时,值是否等于True?

“为什么?”;“不是一个数字”;在Python/Numpy中强制转换为布尔值时,值是否等于True?,python,math,numpy,Python,Math,Numpy,将NumPy Not-a-Number值强制转换为布尔值时,它将变为真,例如,如下所示 >>> import numpy as np >>> bool(np.nan) True 这与我直觉上的预期正好相反。这种行为背后是否有合理的原则 (我怀疑在八度音阶中可能会出现相同的行为。)0.0是唯一的falsy浮点值,因为语言设计者认为这是最有用的。Numpy只是跟着。(当bool(float('nan')为True时,如果bool(np.nan)为False,那就

将NumPy Not-a-Number值强制转换为布尔值时,它将变为真,例如,如下所示

>>> import numpy as np
>>> bool(np.nan)
True
这与我直觉上的预期正好相反。这种行为背后是否有合理的原则


(我怀疑在八度音阶中可能会出现相同的行为。)

0.0
是唯一的falsy浮点值,因为语言设计者认为这是最有用的。Numpy只是跟着。(当
bool(float('nan')
True时,如果
bool(np.nan)
False
,那就很奇怪了)

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

Python声明以下值被视为
False

  • 任何数字类型的零,例如0、0L、0.0、0j
Numpy可能选择了坚持这种行为,并防止NaN在布尔上下文中计算为
False
。但是请注意,您可以使用来测试NaN。

Numpy在这里,任何数值类型的计算结果都是
False
当且仅当其数值为零时


请注意,使用
NaN
值进行真值测试在其他方面也可能是不直观的(例如,
NaN==NaN
的计算结果为
False
)。

这绝不是特定于NumPy的,而是与Python处理NaN的方式一致:

In [1]: bool(float('nan'))
Out[1]: True
这些规则在合同中有详细说明


我认为可以合理地说,NaN的真值应该是假的。但是,这不是语言目前的工作方式。

我的直觉:NaN不等于零,因此转换为布尔值时是正确的。如果NaN为false,则浮点到布尔的转换将需要两个检查,一个为零,一个为NaN。(但我怀疑将Numpy浮点值解释为布尔值并不是常见的做法……)C语言也是如此(Numpy是基于C语言的)。根据标准:
当任何标量值转换为_Bool时,如果值比较等于0,则结果为0;否则,结果为1。
脚注59明确指出,
NaNs不等于0,因此转换为1。
这不取决于语言设计者;努皮族人本可以决定把
nan
也设为假的。@larsmans——这很公平。我没有注意到,
numpy
是OP问题的一部分。但我不认为这真的改变了什么。对于
numpy
来说,做python做的事情是有意义的。应该注意-0.0也是错误的。这是一件一开始可能并不琐碎的事情。我想你的意思是“…计算为
False
if…”沃伦——真的!谢谢.TL;链接文档的灾难恢复:Python将所有内容都视为
True
,除非它是专门定义的错误情况之一(例如,
None
false
、数字零、空序列、返回其中一个的用户定义类等等)。我认为所有类型中都应该是NaN。也就是说,布尔值应该有一个NaN值。NaN不应强制转换为有效值。