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 ,或者用明确的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)
如果有人仍然需要这个 – 假设你有三个布尔数组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))