2015-04-07 17 views
5

Ho un array di NumPy bidimensionale chiamato meta con 3 colonne .. quello che voglio fare è:Numpy: filtra le righe in base a più condizioni?

  1. verifica se le prime due colonne sono ZERO
  2. di controllo se la terza colonna è più piccolo di X
  3. ritorno solo le righe che soddisfano la condizione di

mi ha reso il lavoro, ma la soluzione sembra molto artificiosa:

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

Potresti pensare a un modo più pulito? E 'sembrare difficile avere più condizioni in una sola volta; (

grazie


Spiacente prima volta ho copiato l'espressione sbagliata ... corretto

+1

Funziona con '' ==? hai bisogno di 'numpy.logical_and' – Kasramvd

+1

che non funziona ... fallirà quando entrambi i casi sono falsi –

risposta

7

è possibile utilizzare più filtri in una fetta, qualcosa. in questo modo:

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

ne dite di questo -

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

Campione -

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]]) 
Problemi correlati