Как использовать numpy.where с логическими операторами

Я пытаюсь найти индексы всех элементов массива, которые больше a, но меньше b. Вероятно, это просто проблема с моим синтаксисом, но это не работает:

numpy.where((my_array > a) and (my_array < b))

Как мне это исправить? Или есть лучший способ сделать это?

Спасибо!


person rferdinand    schedule 27.11.2012    source источник
comment
Вы пробовали логические операторы, такие как & вместо и?   -  person RodericDay    schedule 27.11.2012
comment
Просто замена и с & не работает, но я только что обнаружил, что это работает: numpy.where((my_array › a) & (my_array ‹ b) == True)   -  person rferdinand    schedule 27.11.2012
comment
@ user1803782: Можете ли вы объяснить, в чем смысл замены and на & не работает? Это стандартный способ решения этой проблемы.   -  person Mark Dickinson    schedule 27.11.2012
comment
Я на самом деле не уверен, почему он выдал ошибку в первый раз. Теперь это работает. Виноват. Но спасибо.   -  person rferdinand    schedule 27.11.2012


Ответы (1)


Вот два способа:

In [1]: my_array = arange(10)

In [2]: where((my_array > 3) & (my_array < 7))
Out[2]: (array([4, 5, 6]),)

In [3]: where(logical_and(my_array > 3, my_array < 7))
Out[3]: (array([4, 5, 6]),)

Для первого (заменив and на &) будьте осторожны, чтобы правильно добавить круглые скобки: & имеет более высокий приоритет, чем операторы сравнения. Вы также можете использовать *, но я бы не рекомендовал его: он хакерский и не делает читаемый код.

In [4]: where((my_array > 3) * (my_array < 7))
Out[4]: (array([4, 5, 6]),)
person Mark Dickinson    schedule 27.11.2012
comment
что вы имеете в виду под хаки? и почему он всегда возвращает (массив ([4,5,6])), а не просто возвращает массив ([4,5,6])? В чем идея кортежа без второй вещи в нем — синтаксиса возвращаемой вещи? - person usethedeathstar; 21.03.2014
comment
@usethedeathstar: (1) хакерский бит субъективен. Я предполагаю, что моя проблема в том, что (по крайней мере, для меня) поверхностное чтение кода явно не соответствует намерению. (2) Для where возвращается кортеж, поскольку в общем случае where работает с двумя n-мерными массивами и возвращает n-кортеж результатов; здесь вы видите особый случай, когда n=1. Контейнер кортежей немного уродлив, но несовместимость с многомерными случаями, вероятно, была бы еще уродливее. (Ура! Больше субъективизма!) - person Mark Dickinson; 21.03.2014
comment
поэтому, поскольку в этом случае мы получаем массив 1D, кортеж имеет длину 1 элемент, а в случае 2D вы просто получаете массив индексов x и массив индексов y в своем кортеже, показывая координаты x, y точки в вашем 2D-массиве, которые хороши в соответствии с созданной вами логической композицией? - person usethedeathstar; 21.03.2014
comment
@usethedeathstar: Да, именно так. - person Mark Dickinson; 21.03.2014
comment
Bah: работает с двумя n-мерными массивами, должен работать с n-мерным массивом выше. - person Mark Dickinson; 21.03.2014
comment
Спасибо, Марк, это именно то, что я искал - person Umar.H; 01.11.2018