作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
python 中是否有任何方法可以计算跨行或列的二维数组的逐元素或或与操作?
例如,对于以下数组,跨行的逐元素或运算将生成向量 [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)
最佳答案
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 值是以字节形式存储的,因此您可以为此使用廉价的 View 广播。
使用 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 的效果是一样的(实际上尝试在这个地方使用 和
会抛出异常)这是常见的做法
@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
或者:
如果你想坚持使用 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)
关于python - 二维数组的 python 中的元素 AND 或 OR 操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42189975/
我是一名优秀的程序员,十分优秀!