2014-01-14 30 views
5

我有一個名稱數組以及相應的數據數組。從名稱的陣列,也有名字的一個較小的子集: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] 

是否有更有效的方法來做到這一點,不涉及for循環?我應該提到數組本身是從外部文件輸入的,並且實際上有多個數據數組,所以我不能真正改變任何有關數據的內容。

+0

好像沒有人能永遠找到[組例程](http://docs.scipy.org/doc/numpy/reference/routines.set.html)。 (事實上​​,沒有任何一個單獨的函數鏈接到它們的列表,而是指的是'numpy.lib.arraysetopts',並且讓你猜猜如何搜索它,可能沒有幫助。但現代文檔與navbar在頂部應該已經解決了這個問題......) – abarnert

回答

4

您可以使用numpy.in1d,它測試一個數組中的每個元素是否也出現在第二個數組中。

演示

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

in1d返回的bool的ndarray,這類似於您在原始代碼構造的列表:

>>> np.in1d(arr1, arr2) 
array([False, False, True, False, True], dtype=bool)