Numpy的`logical_or`为两个以上的参数

Numpy的logical_or函数不超过两个数组进行比较。 我怎样才能find超过两个数组的联合? (关于Numpy的logical_and和获得两个以上数组的交集,可能会问同样的问题。)

如果你问的是numpy.logical_or ,那么不可以,正如文档明确说的那样,唯一的参数是x1, x2 ,也可以是out

numpy. logical_orx1, x2[, out] )= <ufunc 'logical_or'>


你当然可以像这样链接多个logical_or call:

 >>> x = np.array([True, True, False, False]) >>> y = np.array([True, False, True, False]) >>> z = np.array([False, False, False, False]) >>> np.logical_or(np.logical_or(x, y), z) array([ True, True, True, False], dtype=bool) 

在NumPy中推广这种链接的方法是reduce

 >>> np.logical_or.reduce((x, y, z)) array([ True, True, True, False], dtype=bool) 

当然,如果你有一个multidimensional array而不是单独的数组,那么这也将起作用 – 事实上,这就是它的意图

 >>> xyz = np.array((x, y, z)) >>> xyz array([[ True, True, False, False], [ True, False, True, False], [False, False, False, False]], dtype=bool) >>> np.logical_or.reduce(xyz) array([ True, True, True, False], dtype=bool) 

但是三个等长一维数组的元组在NumPy术语中是一个array_like ,可以用作二维数组。


在NumPy之外,你也可以使用Python的reduce

 >>> functools.reduce(np.logical_or, (x, y, z)) array([ True, True, True, False], dtype=bool) 

但是,与NumPy的reduce不同,Python不是经常需要的。 对于大多数情况,有一种更简单的方法来做事情,例如,将多个Python or操作符链接在一起,不要reduce operator.or_ ,只要使用any operator.or_ 。 而当不存在时,通常使用显式循环更具可读性。

事实上,NumPy的any都可以用于这种情况,尽pipe它不是很平常; 如果你没有明确地给它一个轴,你将会得到一个标量而不是一个数组。 所以:

 >>> np.any((x, y, z), axis=0) array([ True, True, True, False], dtype=bool) 

正如你所期待的, logical_and是相似的 – 你可以链接它, np.reducefunctools.reduce ,或者用明确的axisreplaceall的。

其他操作呢,比如logical_xor ? 再次,同样的交易…除了在这种情况下没有适用的all / anytypes的函数。 (你会怎么称呼它? odd ?)

由于布尔代数根据定义是可交换和关联的,所以下面的语句或等价的布尔值a,b和c。

a or b or c

(a or b) or c

a or (b or c)

(b or a) or c

所以,如果你有一个“逻辑_或”是二元的,你需要传递三个参数(a,b和c),你可以调用

logical_or(logical_or(a, b), c)

logical_or(a, logical_or(b, c))

logical_or(c, logical_or(b, a))

或者你喜欢的任何排列方式。


回到python,如果你想testing一个条件(由一个接受一个被test者并返回一个布尔值的函数test产生)是否适用于a或b或者c或者列表L的任何元素,你通常使用

 any(test(x) for x in L) 

如果有人仍然需要这个 – 假设你有三个布尔数组abc具有相同的形状,这给出and元素明智的:

 a * b * c 

这给出or

 a + b + c 

这是你想要的吗? 堆叠大量的logical_and或者logical_or是不实际的。

使用求和函数:

 a = np.array([True, False, True]) b = array([ False, False, True]) c = np.vstack([a,b,b]) Out[172]: array([[ True, False, True], [False, False, True], [False, False, True]], dtype=bool) np.sum(c,axis=0)>0 Out[173]: array([ True, False, True], dtype=bool) 

基于n维情况的abarnert的答案:

TL; DR: np.logical_or.reduce(np.array(list))