8

在尝试对可能包含nan值的数据(如 numpy 中定义)求逻辑表达式时,我得到了一些令人惊讶的结果。

我想了解为什么会出现这种结果以及如何以正确的方式实施。

我不明白为什么这些表达式的计算结果是它们所做的值:

from numpy import nan

nan and True
>>> True
# this is wrong.. I would expect to evaluate to nan

True and nan
>>> nan
# OK

nan and False
>>> False
# OK regardless the value of the first element 
# the expression should evaluate to False

False and nan
>>> False
#ok

同样对于or

True or nan
>>> True #OK

nan or True
>>> nan #wrong the expression is True

False or nan
>>> nan #OK

nan or False
>>> nan #OK

如何(以有效的方式)实现正确的布尔函数,同时处理nan值?

4

2 回答 2

5

您可以使用numpy命名空间中的谓词:

>>> np.logical_and(True, np.nan), np.logical_and(False, np.nan)
(True, False)
>>> np.logical_and(np.nan, True), np.logical_and(np.nan, False)
(True, False)
>>>
>>> np.logical_or(True, np.nan), np.logical_or(False, np.nan)
(True, True)
>>> np.logical_or(np.nan, True), np.logical_or(np.nan, False)
(True, True)

编辑:内置的布尔运算符略有不同。来自文档: x and y相当于if x is false, then x, else y. 因此,如果第一个参数的计算结果为False,它们将返回它(而不是它的布尔等价物)。所以:

>>> (None and True) is None
True
>>> [] and True
[]
>>> [] and False
[]
>>> 

ETC

于 2013-06-24T11:46:30.893 回答
0

在评估包含 的逻辑表达式and时,我们必须评估存在于运算符两侧的and表达式。而对于or运算符,如果第一个表达式为True,则无需检查第二个表达式的正确性

例如,在计算表达式2>2 and 3==3时,首先我们应该检查第一个表达式是否2>2为真。如果第一个表达式为 False,则无需检查第二个表达式,因为该AND运算符的存在,并且该表达式的结果将是 FALSE,因为第一个表达式为 FALSE。而如果表达式是2==2 AND 3==3,那么由于第一个表达式2==2为真,那么我们不需要检查第二个表达式的正确性,因为这里第二个表达式也是真,我们得到 TRUE 作为输出。

nan and True, sincenan是 True 和 because ofAND运算符中,python 现在将计算第二个表达式并返回第二个表达式的值。所以,在这里你会得到TRUE输出。应用于 时的相同逻辑True and nan,您可以期望nan作为输出。

OR运算符中,如果我们查看第一个表达式就足够了,因此 "True or nan将返回 True

于 2013-06-24T11:07:25.693 回答