为什么python不使用三值逻辑?
我想知道为什么python pandas/numpy不使用true、false和NA实现3值逻辑(所谓的Łukasiewicz逻辑)(比如R)。我已经读过()了,这在某种程度上是由于pandas使用的基本数据类型比R(例如)多得多。然而,我并不完全清楚为什么在这种情况下,逻辑操作的这种奇怪行为不可避免地会丢失值 例如为什么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 #
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”到底是什么意思?在我看来,这种行为在某些情况下可能相当危险。