Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么python不使用三值逻辑?_Python_Pandas_Numpy_Logical Operators - Fatal编程技术网

为什么python不使用三值逻辑?

为什么python不使用三值逻辑?,python,pandas,numpy,logical-operators,Python,Pandas,Numpy,Logical Operators,我想知道为什么python pandas/numpy不使用true、false和NA实现3值逻辑(所谓的Łukasiewicz逻辑)(比如R)。我已经读过()了,这在某种程度上是由于pandas使用的基本数据类型比R(例如)多得多。然而,我并不完全清楚为什么在这种情况下,逻辑操作的这种奇怪行为不可避免地会丢失值 例如 import numpy as np np.nan and False # so far so good, we have False np.nan or False #

我想知道为什么python pandas/numpy不使用true、false和NA实现3值逻辑(所谓的Łukasiewicz逻辑)(比如R)。我已经读过()了,这在某种程度上是由于pandas使用的基本数据类型比R(例如)多得多。然而,我并不完全清楚为什么在这种情况下,逻辑操作的这种奇怪行为不可避免地会丢失值

例如

import numpy as np
np.nan and False   # so far so good, we have False
np.nan or False    # again, good, we have nan
False and np.nan   # False, good
False or np.nan    # give nan, so again, it is correct
np.nan and True    # weird, this gives True, while it should give nan
True and np.nan    # nan, so it is correct, but switching order should not affect the result
np.nan or True     # gives nan, which is not correct, should be True
True or np.nan     # True so it is correct, again switching the arguments changes the result
因此,该示例显示在比较
np.nan
True
值时发生了一些非常奇怪的事情。这是怎么回事

编辑。
感谢您的评论,现在我看到
np.nan
被认为是一个“真实”值。那么,有谁能解释这到底意味着什么,以及这种方法背后的基本原理是什么?

您错误地判断了
语句

将以
bool(value)
的形式检查第一个值是否为真,如果
为假
则取第二个值


另一方面,
bool(value1)
bool(value2)
的形式检查两个值是否同时为
True
,这是numpy行为,至少部分继承自python:

In [11]: bool(float('nan'))
Out[11]: True

In [12]: bool(np.NaN)
Out[12]: True

(NaN是“真实的”。

Pandas 2.0有很多变化,包括如何处理非浮点类型的空值。@Aryamcarthy但是上述内容不会随着
Pandas
2.0而改变。这是最基本的记录,很少有语言区分真、假和第三个“NA”值。通常,强类型表示只有特殊常量具有布尔意义,或者如果许多对象具有布尔意义,那么它们最终都会被视为truthy或falsy。R具有NA值是不寻常的;通用编程语言几乎从来没有这样的价值(您可以编写自己的逻辑来模拟它,但最终该语言只支持truthy或falsyness)。是的,我知道R中的逻辑操作在这方面非常特殊。然而,pandas和numpy都是为了解决与R类似的问题而设计的,所以我想知道为什么这两个模块中没有内置3值逻辑?这是由于一些技术限制还是作者的合理设计决定?@sztal注意,您在上述代码中没有使用
pandas
。所有这些都是纯python,除了使用numpy模块的属性,
np.nan
,但这与
float('nan')
相同,后者只是普通python,注意:真实性决定了
的行为。它甚至不是
numpy
的一部分,因为
np.nan
本质上是
float('nan')
@juanpa.arrivillaga true!那么为什么
np.nan或True会给出
nan
。如果其中一个参数为True,则逻辑or必须生成True,而不管第二个参数是什么。因此,在这种情况下,结果应该是正确的,但事实并非如此。这证明了
np.nan
与三值逻辑不一致。@sztal它不是
np.nan
被认为是“真实的”。在本例中,python检查第一个参数,发现它是
np.nan
,并(过早地)声明结果是不可判定的,但它是非常可判定的,因为参数的on是真的,所以逻辑析取也必须是真的。@juanpa.arrivillaga感谢备份,我想回答这个问题,但想先试试,但手机上缺少python解释器:)@juanpa.arrivillaga,“truthy”到底是什么意思?在我看来,这种行为在某些情况下可能相当危险。