Предположим , у меня есть Numpy массив x = [5, 2, 3, 1, 4, 5]
, y = ['f', 'o', 'o', 'b', 'a', 'r']
. Я хочу выбрать элементы, y
соответствующие элементам x
, которые больше 1 и меньше 5.
Я попытался
x = array([5, 2, 3, 1, 4, 5])
y = array(['f','o','o','b','a','r'])
output = y[x > 1 & x < 5] # desired output is ['o','o','a']
но это не работает Как бы я это сделал?
&
имеет более высокий приоритет, чем<
и>
, которые, в свою очередь, имеют более высокий приоритет, чем (логический)and
.x > 1 and x < 5
сначала оценивает неравенства, а затем логическое соединение;x > 1 & x < 5
оценивает побитовое соединение1
и (значения в)x
, а затем неравенства.(x > 1) & (x < 5)
сначала вынуждает оценивать неравенства, поэтому все операции выполняются в намеченном порядке, и результаты все четко определены. Смотрите документы здесь.(0 < x) & (x < 10)
(как показано в ответе) вместо того,0 < x < 10
чтобы не работать для пустых массивов в любой версии Python.IMO OP на самом деле не хочет
np.bitwise_and()
(ака&
), но на самом деле хочет,np.logical_and()
потому что они сравнивают логические значения, такие какTrue
иFalse
- см. Этот пост SO на логическом и побитовом, чтобы увидеть разницу.И эквивалентный способ сделать это с
np.all()
помощью установкиaxis
аргумента соответствующим образом.по номерам:
так что использование
np.all()
медленнее, но&
иlogical_and
примерно одинаково.источник
output = y[np.logical_and(x > 1, x < 5)]
,x < 5
как оценивается (возможно создание огромного массива), несмотря на то, что это второй аргумент, потому что оценка происходит за пределами функции. IOWlogical_and
получает два уже оцененных аргумента. Это отличается от обычного случаяa and b
, в которомb
не оценивается, еслиa
это правда.Добавьте одну деталь к ответам @JF Себастьяна и @Mark Mikofski:
если кто-то хочет получить соответствующие индексы (а не фактические значения массива), подойдет следующий код:
Для удовлетворения нескольких (всех) условий:
Для удовлетворения нескольких (или) условий:
источник
(the array of indices you want,)
, поэтому вам нужноselect_indices = np.where(...)[0]
получить желаемый результат и ожидать.Мне нравится использовать
np.vectorize
для таких задач. Учтите следующее:Преимущество заключается в том, что вы можете добавить гораздо больше типов ограничений в векторизованную функцию.
Надеюсь, поможет.
источник
На самом деле я бы сделал это так:
L1 - индексный список элементов, удовлетворяющих условию 1; (возможно, вы можете использовать
somelist.index(condition1)
или,np.where(condition1)
чтобы получить L1.)Точно так же вы получите L2, список элементов, удовлетворяющих условию 2;
Тогда вы найдете пересечение, используя
intersect(L1,L2)
.Вы также можете найти пересечение нескольких списков, если выполняете несколько условий.
Затем вы можете применить индекс в любом другом массиве, например, x.
источник
Для 2D-массивов вы можете сделать это. Создайте 2D маску, используя условие. Введите маску условия в int или float, в зависимости от массива, и умножьте ее на исходный массив.
источник