numpy logical_and: 意外行为
假设我给你以下的布尔数组:
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