2014-01-14 2 views
5

У меня есть массив имен вместе с соответствующим массивом данных. Из массива имен, есть также меньшее подмножество имен:boolean индексирование из подмножества списка в python

data = np.array([75., 49., 80., 87., 99.]) 
arr1 = np.array(['Bob', 'Joe', 'Mary', 'Ellen', 'Dick'], dtype='|S5') 
arr2 = np.array(['Mary', 'Dick'], dtype='|S5') 

Я пытаюсь создать новый массив данных, соответствующих только к именам, которые появляются в arr2. Это то, что я смог придумать в одиночку:

TF = [] 
for i in arr1: 
    if i in arr2: 
     TF.append(True) 
    else: 
     TF.append(False) 
new_data = data[TF] 

Есть ли более эффективный способ сделать это, не вовлекают для цикла? Следует отметить, что сами массивы вводятся из внешнего файла, и на самом деле имеется множество массивов данных, поэтому я ничего не могу поделать.

+0

Похоже, что никто никогда не может найти [набор (http://docs.scipy.org/doc/numpy/reference/routines.set.html) в документах. (Тот факт, что ни одна из отдельных функций не ссылается на их список, а все ссылаются на 'numpy.lib.arraysetopts' и заставляют вас угадать, как их искать, возможно, это не помогает. Но современные документы с навигационной панелью наверху должна была решить эту проблему ...) – abarnert

ответ

4

Вы можете использовать numpy.in1d, который проверяет, присутствует ли каждый элемент в одном массиве во втором массиве.

Demo

>>> new_data = data[np.in1d(arr1, arr2)] 
>>> new_data 
array([ 80., 99.]) 

in1d возвращает ndarray из BOOLS, который аналогичен списку Вы сконструированной в исходном коде:

>>> np.in1d(arr1, arr2) 
array([False, False, True, False, True], dtype=bool) 
Смежные вопросы