numpy logical_and: 意外行为

4 投票
3 回答
1911 浏览
提问于 2025-04-18 10:00

假设我给你以下的布尔数组:

b1 = np.array([ True,  True, False,  True ])
b2 = np.array([ True, False, False,  True ])
b3 = np.array([ True,  True,  True, False ])

如果你把它们用AND运算结合在一起,你应该会得到以下结果:

b4 = np.array([ True, False, False, False ])

对吧?如果不是,请解释一下。如果我们达成一致,那为什么会发生以下情况呢?

>>> np.logical_and(b1, b2, b3)
array([ True, False, False,  True ])

np.logical_and(np.logical_and(b1, b2), b3)确实会给出预期的结果。

3 个回答

1

logical_and() 是一个二元运算符,也就是说它需要两个输入。针对你的问题,你可以使用:

np.all([b1, b2, b3], axis=0)
np.logical_and.reduce([b1, b2, b3], axis=0)
6

np.logical_and这个函数中,第三个参数是可选的out参数,它用来存放操作的结果。

也就是说,当你调用np.logical_and(b1, b2, b3)时,它会把np.logical_and(b1, b2)的结果写入到b3中,覆盖掉原来的内容。

输出参数对于确定输出类型和提高效率是很有用的。

11

看看这个np.logical_and的文档。就像大多数NumPy的操作函数一样,第三个参数是一个out参数,用来指定一个目标数组。它不是一个操作数!如果把b3放在这里,会直接覆盖b3里的内容。

在大多数情况下,使用&会更清晰、更简单:

b4 = b1 & b2 & b3

撰写回答