python中是否有任何方法可以跨行或列计算2D数组的元素OR或AND运算?
例如,对于以下数组,跨行的元素OR运算将生成向量[1, 0, 0, 0, 0, 0, 0, 0]
。
array([[1, 0, 0, 0, 0, 0, 0, 0],
[1, 0, 0, 0, 0, 0, 0, 0],
[1, 0, 0, 0, 0, 0, 0, 0],
[1, 0, 0, 0, 0, 0, 0, 0]], dtype=uint8)
答案 0 :(得分:7)
numpy有logical_or
,logical_xor
和logical_and
,其reduce
方法
>> np.logical_or.reduce(a, axis=0)
array([ True, False, False, False, False, False, False, False], dtype=bool)
正如您在示例中看到的那样,他们强制要求bool
dtype,所以如果您需要uint8
,则必须在最后退回。
因为bool存储为字节,所以可以使用廉价的视图广播。
使用axis
关键字,您可以选择沿减少哪个轴。可以选择多个轴
>> np.logical_or.reduce(a, axis=1)
array([ True, True, True, True], dtype=bool)
>>> np.logical_or.reduce(a, axis=(0, 1))
True
keepdims
关键字对于广播非常有用,例如查找行和列的所有“十字”> =数组b
中的= 2
>>> b = np.random.randint(0,10, (4, 4))
>>> b
array([[0, 5, 3, 4],
[4, 1, 5, 4],
[4, 5, 5, 5],
[2, 4, 6, 1]])
>>> rows = np.logical_and.reduce(b >= 2, axis=1, keepdims=True)
# keepdims=False (default) -> rows.shape==(4,) keepdims=True -> rows.shape==(4, 1)
>>> cols = np.logical_and.reduce(b >= 2, axis=0, keepdims=True)
# keepdims=False (default) -> cols.shape==(4,) keepdims=True -> cols.shape==(1, 4)
>>> rows & cols # shapes (4, 1) and (1, 4) are broadcast to (4, 4)
array([[False, False, False, False],
[False, False, False, False],
[False, False, True, False],
[False, False, False, False]], dtype=bool)
注意&
运算符的轻微滥用,代表bitwise_and
。因为bool上的效果相同(实际上在这个地方尝试使用and
会引发异常)这是常见的做法
因为@ajcr指出热门的np.any
和np.all
是np.logical_or.reduce
和np.logical_and.reduce
的简写。
但请注意,存在细微的差异
>>> np.logical_or.reduce(a)
array([ True, False, False, False, False, False, False, False], dtype=bool)
>>> np.any(a)
True
OR:
如果您想坚持使用uint8
并且确定您的所有参赛作品都是0和1,则可以使用bitwise_and
,bitwise_or
和bitwise_xor
>>> np.bitwise_or.reduce(a, axis=0)
array([1, 0, 0, 0, 0, 0, 0, 0], dtype=uint8)