2014-01-14 23 views
5

Ich habe eine Reihe von Namen, zusammen mit einer entsprechenden Anordnung von Daten. Aus der Reihe von Namen, gibt es auch eine kleinere Teilmenge von Namen:boolean Indexieren von einer Teilmenge von einer Liste in 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') 

Ich versuche, eine neue Reihe von Daten zu machen nur den Namen entsprechen, die in arr2 erscheinen. Dies ist, was ich in der Lage gewesen, mit auf meinem eigenen zu kommen:

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

Gibt es eine effizientere Art und Weise, dies zu tun, dass eine nicht für Schleife beinhalten? Ich sollte erwähnen, dass die Arrays selbst von einer externen Datei eingegeben werden und es tatsächlich mehrere Datenfelder gibt, so dass ich daran nichts ändern kann.

+0

Es scheint so, niemand kann jemals die [set finden Routinen] (http://docs.scipy.org/doc/numpy/reference/routines.set.html) in den Dokumenten. (Die Tatsache, dass keine der einzelnen Funktionen verlinkt auf die Liste von ihnen, statt alle auf 'numpy.lib.arraysetopts' und machen Sie erraten, wie der, dass suchen, wahrscheinlich nicht helfen. Aber die moderne docs mit dem navbar an der Spitze sollte das Problem gelöst haben ...) – abarnert

Antwort

4

kann numpy.in1d verwenden, die auch, ob jedes Element in der zweiten Anordnung in einer Array Test.

Demo

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

in1d gibt ein ndarray von bools, die auf die Liste, die Sie in Ihrem ursprünglichen Code aufgebaut ist analog:

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