用于2D数组的python中的元素AND和OR运算

时间:2017-02-12 16:14:14

标签: python numpy logical-operators

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)

1 个答案:

答案 0 :(得分:7)

numpy有logical_orlogical_xorlogical_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.anynp.allnp.logical_or.reducenp.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_andbitwise_orbitwise_xor

>>> np.bitwise_or.reduce(a, axis=0)
array([1, 0, 0, 0, 0, 0, 0, 0], dtype=uint8)