当将NumPy Not-a-Number值转换为布尔值时,它将变为True,例如如下所示。
>>> import numpy as np >>> bool(np.nan) True
字符串这与我的直觉预期完全相反。这种行为背后有一个合理的原则吗?(我怀疑可能有同样的行为似乎发生在八度。
dgsult0t1#
这绝不是NumPy-specific的,但与Python处理NaN的方式是一致的:
In [1]: bool(float('nan')) Out[1]: True
字符串这些规则在文档中有详细说明。我认为可以合理地论证NaN的真值应该是False。然而,这不是目前该语言的工作方式。
r7knjye22#
Python真值测试表明,以下值被认为是False:
False
Numpy可能选择坚持这种行为,并防止NaN在布尔上下文中计算为False。但是请注意,您可以使用numpy.isnan来测试NaN。
numpy.isnan
lnxxn5zx3#
0.0是唯一一个错误的浮点值,因为这是语言设计者认为最有用的。Numpy只是沿着。(当bool(float('nan'))是True时,让bool(np.nan)成为False会很奇怪)。我认为这可能是因为这就是整数的工作方式。诚然,整数没有NaN或inf类型的值,但我认为特殊情况还没有特殊到违反规则。
0.0
bool(float('nan'))
True
bool(np.nan)
1rhkuytd4#
Numpy遵循python的真值测试标准,任何数值类型的计算结果都是False,当且仅当其数值为零。请注意,使用NaN值进行真值测试在其他方面也可能不直观(例如,nan == nan计算为False)。
NaN
nan == nan
yqyhoc1h5#
这通常是在测试np.nan的变数时所需要的。当np.nan is not np.nan失败(评估为False)时,np.isnan函数会运作(评估为True,因此可用来测试np.nan):np.isnan(np.nan)个真
np.nan
np.nan is not np.nan
np.isnan
np.isnan(np.nan)
ua4mk5z46#
您可以使用np.isnan(foo)对NumPynan值进行布尔检查。
In [1]: np.isnan(np.nan) Out[1]: True In [1]: not np.isnan(np.nan) Out[1]: False
字符串https://numpy.org/doc/stable/reference/generated/numpy.isnan.html
6条答案
按热度按时间dgsult0t1#
这绝不是NumPy-specific的,但与Python处理NaN的方式是一致的:
字符串
这些规则在文档中有详细说明。
我认为可以合理地论证NaN的真值应该是False。然而,这不是目前该语言的工作方式。
r7knjye22#
Python真值测试表明,以下值被认为是
False
:Numpy可能选择坚持这种行为,并防止NaN在布尔上下文中计算为
False
。但是请注意,您可以使用numpy.isnan
来测试NaN。lnxxn5zx3#
0.0
是唯一一个错误的浮点值,因为这是语言设计者认为最有用的。Numpy只是沿着。(当bool(float('nan'))
是True
时,让bool(np.nan)
成为False
会很奇怪)。我认为这可能是因为这就是整数的工作方式。诚然,整数没有NaN或inf类型的值,但我认为特殊情况还没有特殊到违反规则。
1rhkuytd4#
Numpy遵循python的真值测试标准,任何数值类型的计算结果都是
False
,当且仅当其数值为零。请注意,使用
NaN
值进行真值测试在其他方面也可能不直观(例如,nan == nan
计算为False
)。yqyhoc1h5#
这通常是在测试
np.nan
的变数时所需要的。当np.nan is not np.nan
失败(评估为False
)时,np.isnan
函数会运作(评估为True
,因此可用来测试np.nan
):np.isnan(np.nan)
个真
ua4mk5z46#
您可以使用np.isnan(foo)对NumPynan值进行布尔检查。
字符串
https://numpy.org/doc/stable/reference/generated/numpy.isnan.html