不使用 numpy.logical_or 的逻辑或

Logical OR without using numpy.logical_or

要知道验证两个条件的numpy数组的元素,可以使用运算符*

>>> a = np.array([[1,10,2],[2,-6,8]])
>>> a
array([[ 1, 10,  7],
       [ 2, -6,  8]])
>>> (a <= 6) * (a%2 == 0) # elements that are even AND inferior or equal to 6
array([[False, False, False],
       [ True,  True, False]], dtype=bool)

但是 OR 呢?我尝试这样做:

>>> (a%2 == 0) + (a <= 6) - (a%2 == 0) * (a <= 6)
array([[ True,  True, False],
       [False, False,  True]], dtype=bool)

但是对于同时验证这两个条件的元素,结果为假。我不明白为什么。

你不需要减法。 关键是 + 已经表现得像 or operator

>>(a%2==0)+(a<=6)
array([[ True,  True,  True],
       [ True,  True,  True]], dtype=bool)

因为“True+True=True”。

当你减去(a<=6)*(a%2==0)时,你将所有满足两个条件的元素变成false

直接做最简单

>>(a<=6)|(a%2==0)
array([[ True,  True,  True],
       [ True,  True,  True]], dtype=bool)

@plonser 的回答是正确的:使用 +.

如果你想再次使用乘法,你可能记得德摩根定律之一告诉你

A or B

在逻辑上等同于

not ( not A and not B )

所以在 NumPy 中你可以写:

>>> ~(~(a%2 == 0) * ~(a <= 6))
array([[ True,  True,  True],
       [ True,  True,  True]], dtype=bool)

但这不是特别可读。