gpt4 book ai didi

python - 二维数组的 python 中的元素 AND 或 OR 操作

转载 作者:行者123 更新时间:2023-11-28 20:37:38 25 4
gpt4 key购买 nike

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_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 值是以字节形式存储的,因此您可以为此使用廉价的 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.anynp.allnp.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_andbitwise_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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com