不使用 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)
但这不是特别可读。
要知道验证两个条件的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)
但这不是特别可读。