在数组的所有元素之间应用布尔运算符

apply a boolean operator among all elements of an array

是否有一种实用的方法可以在不使用 for 循环的情况下将相同的布尔运算符(例如 or)应用于数组的所有元素?

我会用一个例子来说明我需要什么:

import numpy as np
a=np.array([[1,0,0],[1,0,0],[0,0,1]])
b=a[0] | a[1] | a[2]
print b

像我上面所做的那样,将 or 布尔运算符应用于矩阵的所有数组的综合方法是什么?

您可以为此使用 reduce 函数:

from functools import reduce

a = np.array([[1,0,0],[1,0,0],[0,0,1]])
reduce(np.bitwise_or, a)

执行此操作的通常方法是沿轴应用 numpy.any

numpy.any(a, axis=0)

也就是说,还有一种方法可以更直接地通过运营商来完成此操作。 NumPy ufuncs 有一个 reduce 方法,可用于沿数组的轴或跨数组的所有元素应用它们。使用 numpy.logical_or.reduce,我们可以将其表示为

numpy.logical_or.reduce(a, axis=0)

这不会出现太多,因为您想要调用 reduce 的大多数 ufunc 已经定义了等效的辅助函数。 addsummultiplyprodlogical_andalllogical_oranymaximumamaxminimumamin.

试试:

np.any(arr, axis=0)

np.apply_along_axis(any, 0, arr)

或者如果你出于某种原因想使用 pandas,

df.any(axis=0)

注意:我不是 numby 专家,所以我在下面做一个假设;

在您的示例中,b 正在相互比较数组,因此它要求:

“a[0] 中是否有任何项目或 a1 OR any items in a2" is that your goal? in which case, you could use builtin any()

中是否有任何项目

例如(将 numby 更改为简单的列表列表):

a=[[1,0,0],[1,0,0],[0,0,1]]
b=any(a)
print b

b 将为真

但是,如果您想知道其中的任何元素是否为真,例如,您想知道 a[0][0] OR a0 | a0 | [1][0] | ...

您可以使用 builtin map 命令,例如:

a=[[1,0,0],[1,0,0],[0,0,1]]
b=any(map(any, a)
print b

b 仍为真

注意:以下是基于查看 NumPy 文档,而非实际经验。

对于 NumPy,您还可以使用 NumPy any() 选项,例如

a=np.array([[1,0,0],[1,0,0],[0,0,1]])
b=a.any()
print b

或者,如果你无论如何都要计算所有数字,你可以对数组求和,看看它是否 != 0