2015-03-06 3 views
2

Чтобы узнать элементы Numpy массива, который проверяет два условия, можно использовать оператор *:Логическое ИЛИ без использования numpy.logical_or

>>> 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) 

, но результат является ложным для элементов, которые проверяют оба условия. Я не понимаю, почему.

+0

Я не вижу оператора ИЛИ. – HavelTheGreat

+0

Арифметические операции с numpy boolean являются дрянными, это не лучшая идея полагаться на них. Плюс они делают ваш код неясным и трудно интерпретируемым. Если вы имеете дело с булевыми массивами, используйте побитовые операторы: '&' for и, '|' для или, '^' для xor и '~' для нет. – Jaime

+0

В случае, если ответ решит вашу проблему, примите его как решение, например [здесь] (http://meta.stackoverflow.com/a/251399/4367286) – plonser

ответ

3

Вы не нуждаетесь в вычитании. Дело в том, что + уже ведет себя как or оператора

>>(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) 
+0

Мое мнение, но '' 'всегда должно быть предпочтительнее '+'. Когда я вижу '+', я начинаю задаваться вопросом, почему мы добавляем материал вместе, или на самом деле мы конкатенируем вещи. Как только я вижу '|' я думаю о bitwise_or, с которым я тесно связан с logical_or. – Annan

2

@ ответ 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) 

Но thi s не является особенно читаемым.

+0

хорошо. Спасибо за дополнительную информацию – dada

Смежные вопросы