Ошибка будет возникать и в следующих двух сценариях.
Итак, 3 вещи, которые необходимо соблюдать, - добавляются необходимые скрипты, проверяются, добавлены ли они в требуемый порядок и третьи синтаксические ошибки в вашем Java Script.
Ваше выражение работает, если вы добавляете круглые скобки:
>>> y[(1 < x) & (x < 5)]
array(['o', 'o', 'a'],
dtype='|S1')
На самом деле я бы сделал это следующим образом:
L1 - это индексный список элементов, удовлетворяющих условию 1; (возможно, вы можете использовать somelist.index(condition1)
или np.where(condition1)
для получения L1.)
Точно так же вы получаете L2, список элементов, удовлетворяющих условию 2;
. Затем вы найдете пересечение с помощью intersect(L1,L2)
.
Вы также можете найти пересечение нескольких списков, если вы получить несколько условий для удовлетворения.
Затем вы можете применить индекс в любом другом массиве, например, x.
Добавьте одну деталь к @ J.F. Ответы Себастьяна и @ Марка Микофски: Если вы хотите получить соответствующие индексы (а не фактические значения массива), следующий код будет делать:
Для удовлетворения нескольких (всех) условий:
select_indices = np.where( np.logical_and( x > 1, x < 5) ) # 1 < x <5
Для удовлетворения нескольких (или) условий:
select_indices = np.where( np.logical_or( x < 1, x > 5 ) ) # x <1 or x >5
IMO OP фактически не хочет np.bitwise_and()
(aka &
) , но на самом деле хочет np.logical_and()
, потому что они сравнивают логические значения, такие как True
и False
- см. это сообщение SO на логическом против побитового , чтобы увидеть разницу.
>>> x = array([5, 2, 3, 1, 4, 5])
>>> y = array(['f','o','o','b','a','r'])
>>> output = y[np.logical_and(x > 1, x < 5)] # desired output is ['o','o','a']
>>> output
array(['o', 'o', 'a'],
dtype='|S1')
И эквивалентный способ сделать это с помощью np.all()
, соответствующим образом установив аргумент axis
.
>>> output = y[np.all([x > 1, x < 5], axis=0)] # desired output is ['o','o','a']
>>> output
array(['o', 'o', 'a'],
dtype='|S1')
номерами:
>>> %timeit (a < b) & (b < c)
The slowest run took 32.97 times longer than the fastest. This could mean that an intermediate result is being cached.
100000 loops, best of 3: 1.15 µs per loop
>>> %timeit np.logical_and(a < b, b < c)
The slowest run took 32.59 times longer than the fastest. This could mean that an intermediate result is being cached.
1000000 loops, best of 3: 1.17 µs per loop
>>> %timeit np.all([a < b, b < c], 0)
The slowest run took 67.47 times longer than the fastest. This could mean that an intermediate result is being cached.
100000 loops, best of 3: 5.06 µs per loop
, поэтому использование np.all()
выполняется медленнее, но &
и logical_and
примерно одинаковы.
Мне нравится использовать np.vectorize
для таких задач. Рассмотрим следующее:
>>> # Arrays
>>> x = np.array([5, 2, 3, 1, 4, 5])
>>> y = np.array(['f','o','o','b','a','r'])
>>> # Function containing the constraints
>>> func = np.vectorize(lambda t: t>1 and t<5)
>>> # Call function on x
>>> y[func(x)]
>>> array(['o', 'o', 'a'], dtype='<U1')
Преимущество состоит в том, что вы можете добавить еще много типов ограничений в векторизованной функции.
Надеюсь, что это поможет.