当前位置: 首页 > 知识库问答 >
问题:

“和”(布尔值)与”

微生令
2023-03-14

如何解释列表与NumPy数组上布尔运算和按位运算的行为差异?

我对的正确使用感到困惑

mylist1 = [True,  True,  True, False,  True]
mylist2 = [False, True, False,  True, False]

>>> len(mylist1) == len(mylist2)
True

# ---- Example 1 ----
>>> mylist1 and mylist2
[False, True, False, True, False]
# I would have expected [False, True, False, False, False]

# ---- Example 2 ----
>>> mylist1 & mylist2
TypeError: unsupported operand type(s) for &: 'list' and 'list'
# Why not just like example 1?

>>> import numpy as np

# ---- Example 3 ----
>>> np.array(mylist1) and np.array(mylist2)
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
# Why not just like Example 4?

# ---- Example 4 ----
>>> np.array(mylist1) & np.array(mylist2)
array([False,  True, False, False, False], dtype=bool)
# This is the output I was expecting!

这个答案和这个答案帮助我理解了是一个布尔运算但是

我阅读了按位运算以更好地理解这个概念,但我很难使用这些信息来理解我上面的4个示例。

示例4引导我找到了我想要的输出,所以这很好,但我仍然对何时/如何/为什么应该使用感到困惑

有人能帮我理解布尔运算和按位运算之间的区别吗?来解释为什么它们以不同的方式处理列表和NumPy数组?


共有3个答案

缑桐
2023-03-14

短路布尔运算符()不能被覆盖,因为没有令人满意的方法可以在不引入新语言特性或牺牲短路的情况下做到这一点。您可能知道也可能不知道,它们评估第一个操作数的真值,根据该值,要么评估并返回第二个参数,要么不评估第二个参数并返回第一个:

something_true and x -> x
something_false and x -> something_false
something_true or x -> something_true
something_false or x -> x

请注意,返回的是实际操作数(评估结果),而不是真值。

自定义其行为的唯一方法是重写__nonzero__(在 Python 3 中重命名为__bool__),以便您可以影响返回的操作数,但不能返回其他操作数。列表(和其他集合)被定义为“真实”,当它们包含任何内容时,和“falsey”当它们为空时。

NumPy数组拒绝这一概念:对于它们所针对的用例,两种不同的真理概念是常见的:(1)是否有任何元素为真,以及(2)是否所有元素都为真。由于这两者完全(并且无声地)不兼容,而且两者都不明显更正确或更常见,NumPy拒绝猜测,并要求您明确使用. any(). all()

<代码>

沈英勋
2023-03-14
匿名用户

首先是非常重要的一点,一切都将从这一点开始(我希望如此)。

在普通Python中,< code>list在任何方面都不特殊(除了有可爱的构造语法,这多半是历史偶然)。一旦创建了列表< code>[3,2,6],它实际上就是一个普通的Python对象,就像数字< code>3、集合< code>{3,7}或函数< code>lambda x: x 5。

(是的,它支持更改其元素,并且支持迭代和许多其他东西,但这正是类型的含义:它支持一些操作,而不支持其他一些操作。int支持提升到幂,但这并没有使它变得非常特殊-它只是int的含义。lambda支持调用,但这并不使它变得很特殊-毕竟,这就是lambda的用途:)。

< code >和不是运算符(您可以称之为“运算符”,但也可以称之为“for”运算符:)。Python中的运算符是(通过)对某种类型的对象调用的方法,通常作为该类型的一部分编写。方法没有办法保存对它的一些操作数的求值,但是< code >和可以(并且必须)做到这一点。

其后果是,不能超载,就像不能超载一样。它是完全通用的,并通过指定的协议进行通信。你可以做的是自定义你的协议部分,但这并不意味着你可以完全改变的行为。协议是:

想象一下Python解释“a和b”(这不是以这种方式发生的,但它有助于理解)。当谈到“和”时,它看着它刚刚评估的对象(a),并问它:你是真的吗?(不是:你是真的吗?如果您是 a 的类的作者,则可以自定义此答案。如果一个答案“不”,并且(完全跳过b,它根本没有被评估,并且)说:a是我的结果(不是:False是我的结果)。

如果a不回答,会问:你的长度是多少?(同样,您可以将其自定义为a类的作者)。如果a回答0,则同上-认为它是错误的(非错误),跳过b,并给出 作为结果。

如果a对第二个问题(“你的长度是多少”)回答了0以外的内容,或者它根本没有回答,或者它对第一个问题回答了“是”(“你是真的吗”),评估b,并说:b是我的结果。请注意,它不会问b任何问题。

换句话说,如果a else a,则< code>a和b几乎与< code>b相同,只是a只计算一次。

现在用笔和纸坐几分钟,说服自己,当 {a,b} 是 {True,False} 的子集时,它的工作方式完全符合您对布尔运算符的期望。但我希望我已经说服了你,它更普遍,正如你所看到的,这种方式更有用。

现在我希望你理解你的例子1。< code>and不关心mylist1是数字、列表、lambda还是Argmhbl类的对象。它只关心mylist1对协议问题的回答。当然,我的列表1回答了关于长度的问题5,所以返回了我的列表2。仅此而已。它与mylist1和mylist2的元素没有任何关系——它们没有进入图片的任何地方。

另一方面,<代码>

另一方面:-D,numpy数组是特殊的,或者至少它们正在尝试这样做。当然,笨蛋。array只是一个类,它不能以任何方式覆盖,所以它做得最好:当被问及“areyoutrue”时,numpy。数组引发了一个ValueError,有效地表示“请重新表述这个问题,我的真理观不适合您的模型”。(请注意,ValueError消息不涉及,因为numpy.array不知道是谁在问这个问题;它只涉及真相。)

高温高压,

李星波
2023-03-14

测试两个表达式是否在逻辑上都为True

在Python中,空内置对象通常在逻辑上被视为False,而非空内置对象在逻辑上是True。这有助于常见的用例,如果列表为空,则需要执行某些操作,如果列表不为空,还需要执行其他操作。注意,这意味着列表[False]在逻辑上为True:

>>> if [False]:
...    print 'True'
...
True

因此,在示例1中,第一个列表是非空的,因此逻辑上True,因此和True,但识别它需要不必要的计算步骤。)

例如2,列表不能以按位方式进行有意义的组合,因为它们可以包含任意不同的元素。可以按位组合的内容包括:Trues和Falses,整数。

相反,NumPy对象支持矢量化计算。也就是说,它们允许您对多段数据执行相同的操作。

示例3失败,因为NumPy数组(长度为

示例4只是一个矢量化位操作。

底线

>

  • 如果您不处理数组,也不执行整数的数学操作,那么您可能需要

    如果您有希望组合的真值向量,请使用numpy

  •  类似资料:
    • 问题内容: 语言是Java。鉴于这种: 我知道这是一个等效的测试,它将给出结果:true或false。但是,据我所知,with 是一个声明,它在这种情况下应该不返回任何内容:返回true,与test 完全相同? 你能解释为什么吗?谢谢! 问题答案: 计算结果为: 首先,您将文字分配给标识符。然后您在分配后对其进行测试

    • null 和 undefined 概述 null与undefined都可以表示“没有”,含义非常相似。将一个变量赋值为undefined或null,老实说,语法效果几乎没区别。 var a = undefined; // 或者 var a = null; 上面代码中,变量a分别被赋值为undefined和null,这两种写法的效果几乎等价。 在if语句中,它们都会被自动转为false,相等运算符

    • 问题内容: 哪种列类型最适合在MySQL数据库中使用布尔值?我用,但我的同事用。 问题答案: 这些数据类型是同义词。

    • 到目前为止我们看到的类型都能表示很大范围的数据,整数多的是,而浮点数更多。相对而言,字符集的规模小的多。C++中还有一个类型表示的范围更小,即布尔类型,它只能表示true和false两个值。 虽然没提到过该类型,但我们前面几章中实际已经使用过布尔值了。if语句和while语句中的条件就是布尔表达式。比较操作符的结果也是布尔值。例如: if (x == 5) { // 进行某些处理 } ==操

    • 原文: http://exploringjs.com/impatient-js/ch_booleans.html 基本类型 _ 布尔 _ 包含两个值 - false和true: > typeof false 'boolean' > typeof true 'boolean' 14.1。转换为布尔值 这三种方法可以将任意值x转换为布尔值。 Boolean(x) 最具描述性;推荐的。 x ?

    • 我公开了一个使用另一个SOAP服务的服务。我得到了JAXB生成的服务模型。当我使用服务时,数据被设置到与此模型相关的对象中。我定义了自己的域模型,它与JAXB模型具有完全相同的类集,但没有xml注释等。我使用dozer来执行数据映射。当标记为注释(nillable=true)的某些布尔元素为null时,我的域模型中的目标对象布尔对象将设置为默认的true或false值。我希望它保留相同的空值。布尔