如何在二维numpy数组上执行按行的OR操作?

3
我有一个numpy数组。
[[1, 0, 1],
  [1, 0, 0],
  [0, 0, 1]]

我希望对它执行逐行或操作,以使结果数组如下所示:[1, 0, 1]。是否有不需要实现循环的简单方法?如果有人能提供建议,我将非常感激。谢谢。

b = a[0,:] | a[1,:] | a[2,:],其中a是numpy数组。这个方法效果不错,但我正在寻找更精确、更紧凑的方法。 - deepayan das
2个回答

4
你可以通过调用any生成布尔掩码,然后将其转换为int来将TrueFalse分别转换为10
In[193]:
a.any(0).astype(int)

Out[193]: array([1, 0, 1])
< p > any 的第一个参数是轴参数,这里我们可以看到轴0和轴1之间的区别:

In[194]:
a.any(0)

Out[194]: array([ True, False,  True], dtype=bool)

In[195]:
a.any(1)

Out[195]: array([ True,  True,  True], dtype=bool)

4
如果你更喜欢使用按位或(在Python中,|运算符是按位或,而or运算符是布尔或),你可以使用np.bitwise_or()。然而,这只接受两个数组作为输入,因此您可以使用Numpy的reduce()功能来组合数组中的所有子数组。
>>> a = np.array([[1, 0, 1],[1, 0, 0],[0, 0, 1]])
>>> np.bitwise_or.reduce(a, 0)
array([1, 0, 1])

我喜欢这种明确的方法,但a.any()解决方案已经很常见了,不会引起任何注意。 reduce的第一个参数是array,第二个参数是你要减少的axis。所以如果您愿意,也可以按列进行操作,或者按照其他轴进行操作。
>>> a = np.array([[1, 0, 1],[1, 0, 0],[0, 0, 1]])
>>> np.bitwise_or.reduce(a, 1)
array([1, 1, 1])

嘿,谢谢@Alexander Reynolds,这正是我在寻找的。 - deepayan das
2
虽然我会使用np.bitwise_or.reduce(a, 0)更加明确,但你比我快30秒回答了这个问题。 - Daniel F
@DanielF 我同意,我会添加的。谢谢! - alkasm
@deepayandas 如果我的解决方案符合您的要求,您能否接受我的答案?否则,如果您对任何扩展感兴趣,我可以详细说明。 - alkasm
@deepayandas 很好,我刚刚也添加了所有相关函数的文档链接。 - alkasm

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接