2015-04-07 23 views
5

Ich habe ein zweidimensionales numpy Array meta mit 3 Spalten genannt .. was ich tun möchte, ist:Numpy: Zeilen nach mehreren Bedingungen filtern?

  1. überprüfen, ob die ersten beiden Spalten ZERO
  2. Prüfung sind, wenn die dritte Spalte kleiner als X ist
  3. Rückkehr nur die Zeilen, die die Bedingung

ich habe es funktioniert, aber die Lösung scheint sehr gekünstelt entsprechen:

meta[ np.logical_and(np.all(meta[:,0:2] == [0,0],axis=1) , meta[:,2] < 20) ] 

Konnten Sie an sauberere Weise denken? Es scheint schwer, um mehrere Bedingungen zu haben, (

dank


Leider erstes Mal, dass ich den falschen Ausdruck korrigiert kopiert ...

+1

, wie es mit 'arbeitet =='? Sie brauchen 'numpy.logical_and' – Kasramvd

+1

, das nicht funktioniert ... es wird fehlschlagen, wenn beide Fälle falsch sind –

Antwort

7

Sie mehrere Filter in einer Scheibe, etwas verwenden können. wie folgt aus:

x = np.arange(90.).reshape(30, 3) 
#set the first 10 rows of cols 1,2 to be zero 
x[0:10, 0:2] = 0.0 
x[(x[:,0] == 0.) & (x[:,1] == 0.) & (x[:,2] > 10)] 
#should give only a few rows 
array([[ 0., 0., 11.], 
     [ 0., 0., 14.], 
     [ 0., 0., 17.], 
     [ 0., 0., 20.], 
     [ 0., 0., 23.], 
     [ 0., 0., 26.], 
     [ 0., 0., 29.]]) 
2

Wie wäre es damit -

meta[meta[:,2]<X * np.all(meta[:,0:2]==0,1),:] 

Probelauf -

In [89]: meta 
Out[89]: 
array([[ 1, 2, 3, 4], 
     [ 0, 0, 2, 0], 
     [ 9, 0, 11, 12]]) 

In [90]: X 
Out[90]: 4 

In [91]: meta[meta[:,2]<X * np.all(meta[:,0:2]==0,1),:] 
Out[91]: array([[0, 0, 2, 0]]) 
Verwandte Themen