2016-05-26 2 views
1

У меня есть два numpy массивов, скажет A и BPython, напротив условного массива

In [3]: import numpy as np 

In [4]: A = np.array([0.10,0.20,0.30,0.40,0.50]) 

In [5]: B = np.array([0.15,0.23,0.33,0.41,0.57]) 

применяет состояние, как это:

In [6]: condition_array = A[(B>0.2)*(B<0.5)] 

In [7]: condition_array 
Out[7]: array([ 0.2, 0.3, 0.4]) 

Теперь, как я могу получить противоположный condition_array?

т.е. значений массива A, для которых массив B является NOT GREATER THAN 0.2 and NOT LESS THAN 0.5?

In [8]: test_array = A[(B<0.2)*(B>0.5)] 

In [9]: test_array 
Out[9]: array([], dtype=float64) 

Выше, кажется, не работает!

+0

«НЕ БОЛЬШЕ» - это то же самое, что «МЕНЬШЕ, ЧЕМ ИЛИ РАВНО», а «НЕ МЕНЕЕ» - это то же самое, что «БОЛЬШЕ ЧЕМ ИЛИ РАВНО» –

+0

@EliSadoff: Да, я знаю об этом, так что это решение? – ThePredator

+0

Он работает нормально, но не существует значения, которое равно «< 0.2' and '> 0.5», что и запрашивает ваш код. –

ответ

3

Вы можете использовать оператор ~, чтобы инвертировать массив ...

A[~((B>0.2)*(B<0.5))] 

Обратите внимание, что использование * кажется, что это означало, чтобы сделать логический «и». Многие люди предпочитают использовать двоичный «и» оператор (&) вместо - Лично я предпочитаю, чтобы быть еще более четко:

A[~np.logical_and(B > 0.2, B < 0.5)] 

В качестве альтернативы, следующие работы тоже:

A[(B <= 0.2) | (B >= 0.5)] 
A[np.logical_or(B <= 0.2, B >= 0.5)] 
+0

Ох! Что это за колдовство! Я никогда не знал об инвертирующем операторе! В документах есть только оператор 'not', почему они не упомянули о' ~ '? Есть идеи? – ThePredator

+0

Python поддерживает полный набор «побитовых» операторов ('|', '&', '~', '^', '>>', '<<'). Для встроенных типов они используются только для работы с 'int',' long'. (Некоторые из операторов работают и с объектами 'set'). Для логических массивов numpy '~', '|' и '&' перегружены для выполнения логических эквивалентов. В противном случае я думаю, что они работают только с целыми массивами. – mgilson

+0

По какой причине вы сказали, что не используете '*' и вместо этого используете 'np.logical_and'? Разве они не то же самое? – ThePredator

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