Numpy的`logical_or`为两个以上的参数
Numpy的logical_or
函数不超过两个数组进行比较。 我怎样才能find超过两个数组的联合? (关于Numpy的logical_and
和获得两个以上数组的交集,可能会问同样的问题。)
如果你问的是numpy.logical_or
,那么不可以,正如文档明确说的那样,唯一的参数是x1, x2
,也可以是out
:
numpy.
logical_or
(x1, 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.reduce
, functools.reduce
,或者用明确的axis
replaceall
的。
其他操作呢,比如logical_xor
? 再次,同样的交易…除了在这种情况下没有适用的all
/ any
types的函数。 (你会怎么称呼它? 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)
如果有人仍然需要这个 – 假设你有三个布尔数组a
, b
, c
具有相同的形状,这给出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))