【问题标题】:Python 2.x True & False returning True in very specific casePython 2.x True & False 在非常特殊的情况下返回 True
【发布时间】:2016-06-10 16:51:55
【问题描述】:

我到处寻找答案,抱歉,如果这是一个非常基本的问题。我正在使用一个布尔 Numpy 数组过滤 Numpy 数组,该数组是通过比较 3 个不同数组中相同索引处的值创建的。我的比较由 2 个单独的布尔语句组成,例如 x[i]==y[i] & x[i]!=z[i],用于所有索引 i。以下是令人不安的结果:

x[8]=25

y[8]=27

z[8]=13

x[8]==y[8]

False

x[8]!=z[8]

True

x[8]==y[8] & x[8]!=z[8]

True

如你所见,上面的 False & True 返回一个 True。我错过了什么?作为另一个让我感到沮丧的例子,这是来自相同数组的另一个返回正确结果的例子:

x[3]=24

y[3]=18

z[3]=27

x[3]==y[3]

False

x[3]!=z[3]

True

x[3]==y[3] & x[3]!=z[3]

False

如您所见,此示例运行良好。任何帮助将不胜感激。

谢谢!

【问题讨论】:

    标签: python arrays numpy boolean


    【解决方案1】:

    我错过了什么?

    你缺少括号:

    (x[8]==y[8]) & (x[8]!=z[8])
    

    此外,您应该将其作为对整个数组的矢量化操作来执行,而不是通过对索引进行循环。希望您在真实代码中这样做,并且您只是在此处使用特定索引来简化示例:

    (x == y) & (x != z)  # Evaluates to an array of booleans.
    

    & 是按位与运算符,而不是逻辑与,但由于逻辑and 不能被重载用于广播(有充分的理由),NumPy 使用& 对布尔数组进行逻辑与。 &and 的优先级不同,因此您需要将一些不需要用and 括起来的操作括起来。

    【讨论】:

    • "NumPy 使用& 对布尔数组进行逻辑与" 这实际上是有道理的,因为布尔值上的逻辑和按位运算本质上是相同的(尤其是如果您认为 True 为 1,False 为 0)
    • 谢谢!这是一个很好的答案,并立即解决了所有问题。是的,我只是以特定索引为例。再次感谢!
    【解决方案2】:

    做 (x[8]==y[8]) & (x[8]!=z[8]) 甚至更好 x[8]==y[8] 和 x[8]!=z[8]

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-12-07
      • 2013-02-23
      • 2023-03-10
      • 2021-07-02
      • 1970-01-01
      • 2017-05-02
      • 2012-02-27
      相关资源
      最近更新 更多