2015-07-30 11 views
6

Sono nuovo di Python e non riesco ancora a definirmi un programmatore Python. A proposito, per favore portami con me se la mia domanda non ha senso.Trova il massimo di ogni riga in una matrice numpy e l'elemento corrispondente in un'altra matrice della stessa dimensione

Domanda:

Ho due matrici numpy della stessa dimensione, ad esempio A e B dove A.shape è uguale a B.shape ed entrambi uguali (5.1000), e voglio trovare il valore massimo di ogni riga in A e l'elemento corrispondente di quello in B. Ad esempio, se nella quarta riga di A, l'indice di elemento massimo è 104, quindi vorrei trovare il 104esimo elemento della quarta riga nell'array B e lo stesso per il resto delle righe.

So che posso farlo collegando le righe, ma mi chiedevo se c'era un modo più elegante di farlo. Ad esempio, se dovessi farlo in MATLAB vorrei scrivere il seguente codice:

B(bsxfun(@eq,A,max(A,[],2))) 

Tutto l'aiuto che mi guida attraverso la giusta direzione sarebbe molto apprezzato.

risposta

6

Ecco il numpy linguaggio per fare la stessa cosa:

b[np.arange(len(a)), np.argmax(a, axis=1)] 

Ad esempio:

>>> a = np.array([ 
    [1, 2, 0], 
    [2, 1, 0], 
    [0, 1, 2] 
    ]) 
>>> b = np.array([ 
    [1, 2, 3], 
    [1, 2, 3], 
    [1, 2, 3] 
    ]) 
>>> b[np.arange(len(a)), np.argmax(a, axis=1)] 
array([2, 1, 3]) 
+0

buona risposta (+1), che ne dici di provare a costruire una soluzione usando 'np.argpartition'? –

+0

Era intelligente! Ecco perché sto iniziando ad amare Python. Puoi fare cose complicate con semplici comandi! – Omid

1

Essendo un amante bsxfun, è bello vedere la gente cercando di replicare la stessa funzionalità per altri programmi le lingue. Ora, bsxfun è fondamentalmente un meccanismo broadcasting, che esiste anche in NumPy. In NumPy, si ottiene creando dimensioni singleton con np.newaxis o semplicemente None.

Tornando alla domanda nel contesto, una equivalent radiotelevisivo soluzione basata potrebbero essere attuate come indicato come un esempio di esecuzione -

In [128]: A 
Out[128]: 
array([[40, 63, 67, 65, 19], 
     [85, 55, 66, 92, 88], 
     [50, 1, 23, 6, 59], 
     [67, 55, 46, 78, 3]]) 

In [129]: B 
Out[129]: 
array([[78, 63, 45, 34, 81], 
     [ 5, 38, 28, 61, 66], 
     [ 3, 65, 16, 25, 32], 
     [72, 1, 31, 75, 6]]) 

In [130]: B[A == A.max(axis=1)[:,None]] 
Out[130]: array([45, 61, 32, 75]) 
0

print np.max(A[i]) Questo darà il più alto del i esima riga di una matrice numpy.

Problemi correlati