numpy有logical_or、logical_xor和{},它们有一个reduce方法>> np.logical_or.reduce(a, axis=0)
array([ True, False, False, False, False, False, False, False], dtype=bool)
正如您在示例中看到的,它们强制使用bool数据类型,因此,如果您需要uint8的话,您必须在最后进行转换。在
因为bool是以字节形式存储的,所以可以使用廉价的viewcasting。在
使用axis关键字,您可以选择要缩小的轴。可以选择多个轴
^{pr2}$
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。因为对bools的效果是一样的(事实上,在这个地方尝试使用and会引发一个异常),所以这是一种常见的做法
正如@ajcr指出的,流行的np.any和{}是{}和{}的简写。
不过,请注意,两者之间存在细微的差异>>> np.logical_or.reduce(a)
array([ True, False, False, False, False, False, False, False], dtype=bool)
>>> np.any(a)
True
或者:
如果您想坚持使用uint8,并且知道您的所有条目都是0和1,那么可以使用bitwise_and、bitwise_or和{}>>> np.bitwise_or.reduce(a, axis=0)
array([1, 0, 0, 0, 0, 0, 0, 0], dtype=uint8)