2014-05-18 3 views
11

Ho una grande matrice M. Alcune delle righe della matrice hanno tutti i loro elementi come zero e ho bisogno di ottenere gli indici di quelle righe. L'approccio ingenuo che sto considerando è quello di scorrere ogni riga della matrice e quindi controllare ciascun elemento. Tuttavia penso che ci sia un approccio migliore e più veloce per realizzare questo utilizzando numpy. Spero che tu possa aiutare!Trovare le righe che hanno tutti gli elementi come zeri in una matrice numpy

risposta

16

Ecco un modo. Presumo che il numpy sia stato importato usando import numpy as np.

In [20]: a 
Out[20]: 
array([[0, 1, 0], 
     [1, 0, 1], 
     [0, 0, 0], 
     [1, 1, 0], 
     [0, 0, 0]]) 

In [21]: np.where(~a.any(axis=1))[0] 
Out[21]: array([2, 4]) 

Si tratta di una lieve variazione di questa risposta: How to check that a matrix contains a zero column?

Ecco quello che sta succedendo:

Il metodo any restituisce True se qualsiasi valore nella matrice è "truthy". I numeri diversi da zero sono considerati Veri e 0 è considerato Falso. Utilizzando l'argomento axis=1, il metodo viene applicato a ciascuna riga. Per l'esempio a, abbiamo:

In [32]: a.any(axis=1) 
Out[32]: array([ True, True, False, True, False], dtype=bool) 

Così ogni valore indica se la riga corrispondente contiene un valore diverso da zero. L'operatore ~ è il binario "non" o complementare:

In [33]: ~a.any(axis=1) 
Out[33]: array([False, False, True, False, True], dtype=bool) 

(. Un'espressione alternativa che fornisce lo stesso risultato è (a == 0).all(axis=1))

Per ottenere gli indici riga, si usa la funzione where. Esso restituisce gli indici in cui il suo argomento è vero:

In [34]: np.where(~a.any(axis=1)) 
Out[34]: (array([2, 4]),) 

Nota che where restituito una tupla contenente un singolo array. where funziona per gli array n-dimensionali, quindi restituisce sempre una tupla. Vogliamo il singolo array in quella tupla.

In [35]: np.where(~a.any(axis=1))[0] 
Out[35]: array([2, 4]) 
+0

Che risposta favolosa, GRAZIE! – holografix