2014-11-27 13 views
8

Ho bisogno di capire come posso trovare tutto l'indice di un valore in una matrice numdy 2d.Come trovare l'indice di un valore in array 2d in Python?

Per esempio, ho il seguente array 2d:

([[1 1 0 0], 
    [0 0 1 1], 
    [0 0 0 0]]) 

ho bisogno di trovare l'indice di tutte le 1 e 0.

1: [(0, 0), (0, 1), (1, 2), (1, 3)] 
0: [(0, 2), (0, 3), (1, 0), (1, 1), (the entire all row)] 

Ho provato questo ma non mi dà tutti gli indici:

t = [(index, row.index(1)) for index, row in enumerate(x) if 1 in row] 

Fondamentalmente, mi dà solo una dell'indice in ogni riga [(0, 0), (1, 2)].

+0

è in realtà un array numpy? –

+0

sì, il suo . In realtà ho un grande array 2d e l'ho ottenuto dall'estrazione di un'immagine. – Pete

+0

ci sono solo uno e zero? –

risposta

17

È possibile utilizzare np.where per restituire una tupla di matrici di indici xey in cui una determinata condizione contiene una matrice.

Se a è il nome della matrice:

>>> np.where(a == 1) 
(array([0, 0, 1, 1]), array([0, 1, 2, 3])) 

Se si desidera un elenco di (x, y) le coppie, si potrebbe zip i due array:

>>> zip(*np.where(a == 1)) 
[(0, 0), (0, 1), (1, 2), (1, 3)] 

O, ancora meglio, @jme sottolinea che np.asarray(x).T può essere un modo più efficiente per generare le coppie.

+1

Solo una nota: 'zip (* x)' può essere lento per grande 'x', dove' x = np.where (a == 1) '. Se un array 2d va bene, 'np.asarray (x) .T' è un po 'più veloce, e se vuoi * veramente * un elenco di liste,' np.asarray (x) .T.tolist() 'è leggermente più veloce. – jme

6

Il problema con la comprensione lista che hai fornito è che si va un solo livello, è necessario un elenco nidificato di comprensione:

a = [[1,0,1],[0,0,1], [1,1,0]] 

>>> [(ix,iy) for ix, row in enumerate(a) for iy, i in enumerate(row) if i == 0] 
[(0, 1), (1, 0), (1, 1), (2, 2)] 

Detto questo, se si sta lavorando con una serie NumPy, è meglio utilizzare le funzioni integrate come suggerito da ajcr.

+0

Grazie anche per questa soluzione. – Pete

Problemi correlati