2017-04-27 4 views

Antwort

1

Sie np.in1d zwischen einer Maske von Spielen erstellen können entfernt werden die erste Spalte von n und k und dann die invertierte Maske verwenden, um die nicht übereinstimmenden Zeilen aus n auszuwählen, so -

n[~np.in1d(n[:,0].astype(int), k)] 

Wenn die erste Spalte bereits von int dtype ist, überspringen Sie den .astype(int) Konvertierungsschritt.

Probelauf -

In [41]: n 
Out[41]: 
array([['1', 'a'], 
     ['2', 'b'], 
     ['3', 'c'], 
     ['4', 'c'], 
     ['99', 'a'], 
     ['100', 'e']], 
     dtype='|S21') 

In [42]: k 
Out[42]: [1, 3, 99] 

In [43]: n[~np.in1d(n[:,0].astype(int), k)] 
Out[43]: 
array([['2', 'b'], 
     ['4', 'c'], 
     ['100', 'e']], 
     dtype='|S21') 

Für peformance, wenn die erste Spalte sortiert wird, können wir verwenden np.searchsorted -

mask = np.ones(n.shape[0],dtype=bool) 
mask[np.searchsorted(n[:,0], k)] = 0 
out = n[mask] 
+0

Vielen Dank! Das ist toll :) – Wenhui

+0

die searchsorted Lösung entfernt nur das erste passende Element von k, andere zwei Zeilen werden nicht entfernt – Wenhui

+0

@Wenhui Ist die erste Spalte von 'n' sortiert? Wenn ja, versuchen Sie es mit 'mask [np.searchsorted (n [:, 0] .astype (int), k)] = 0'. – Divakar

0

Wenn, einfache Lösung, wie unten Verzeichnen Sie bitte Ihre Datenstruktur finden Sie können jedoch in list by list() -Methode konvertieren.

def check(list): 
k=[1,3,99] 
if(list[0] not in k): 
    return list 

final_list = map(check,n) 
final_list = final_list.remove(None) 
print final_list 
Verwandte Themen