2017-02-22 49 views
1

Каков наилучший способ передать несколько критериев, любые из которых действительны, в массив и вернуть булевский индекс, чем тогда можно использовать в качестве фильтра? Доступные решения следуют за if, then framework, который больше, чем мне нужно.Множество критериев для булевых индексирования

Я понимаю, что я могу сделать следующее:

In[1]: 
names = np.array(['Bob','Joe','Bob','Will']) 
data = np.random.randn(4,4) 
mask = (names=='Bob')|(names=='Will') 
data[mask] 

Out[1]: 
array([[-0.25883247, -0.06236544, -0.02296274, 1.36340923], 
     [ 0.3907503 , -2.38917418, -0.49057852, -0.25427256], 
     [ 0.02648891, -1.27278901, -0.31815915, 1.72876199]]) 

Но что, если у меня было 100 имен, чтобы проверить, а не 2?

ответ

2

Вы можете поместить все имена в списке, а затем использовать np.in1d для генерации mask:

mask = np.in1d(names, ['Bob', 'Will']) 

mask 
# array([ True, False, True, True], dtype=bool) 
+0

Это полезно, но я ошибочно предположил, что это будет работать для серии панд в то же время сохраняя значения индекса этой серии. Это не так. Есть ли другое решение? – trob

+0

Если у вас есть серия pandas, эквивалентная версия - это метод isin. Итак, 'names.isin (['Bob', 'Will']). – Psidom