2016-04-27 18 views
0

Also habe ich diese Matrix, die ist.Indizierung in Python mit Array von Indizes

Dann finde ich für jede Zeile das maximale Element mit dieser z= M.argmax(axis=1) So z is a 60 element array enthält Indexe von 0-7.

Abgesehen von der altmodischen Art, mit Schleifen zu iterieren, könnte ich eine Art vektorisierten Code in Python verwenden, um die Werte von M zu drucken, wobei ich das Maximum mithilfe der z-Matrix erhalten habe.

+0

Sie suchen [numpy] (http://www.numpy.org/). Insbesondere [numpy.where] (http://docs.scipy.org/doc/numpy/reference/generated/numpy.where.html) –

Antwort

0
import numpy as np 

# define our matrix M 
M = np.arange(6*8).reshape(6,8) 

Wenn wir bei M aussehen:

> M 
> array(
    [[ 0, 1, 2, 3, 4, 5, 6, 7], 
    [ 8, 9, 10, 11, 12, 13, 14, 15], 
    [16, 17, 18, 19, 20, 21, 22, 23], 
    [24, 25, 26, 27, 28, 29, 30, 31], 
    [32, 33, 34, 35, 36, 37, 38, 39], 
    [40, 41, 42, 43, 44, 45, 46, 47]]) 

> M.shape 
> (6, 8) 

Jetzt haben wir die maximale arg jeder Zeile erhalten:

> z = np.argmax(M, axis=1) 
> array([7, 7, 7, 7, 7, 7]) 

So haben wir den Index des max-Element für jedes Reihe. Wenn wir die Werte zurück bekommen möchten, können wir einfach durch M schneiden:

> M[np.arange(M.shape[0]), z] 
> array([ 7, 15, 23, 31, 39, 47]) 

np.arange(M.shape[0]) Indizes für jede Zeile erzeugt, während z die Indizes für die Spalten abdeckt. Daher extrahieren wir das n-te Element (gemäß den Einträgen von z) jeder Zeile.


Um dies zu beweisen für beliebige Werke "sortiert" -Arrays:

> M2 = np.ravel(np.copy(M)) 
> np.random.shuffle(M2) 
> M2 = M2.reshape(M.shape[0], M.shape[1]) 
> M2 
> array(
    [[34, 16, 5, 32, 31, 2, 17, 38], 
    [33, 18, 9, 46, 20, 4, 39, 30], 
    [10, 41, 35, 23, 0, 24, 45, 14], 
    [28, 36, 8, 22, 11, 15, 7, 44], 
    [27, 1, 25, 6, 3, 19, 47, 37], 
    [40, 42, 29, 21, 12, 43, 26, 13]]) 

> z2 = np.argmax(M2, axis=1) 
> array([7, 3, 6, 7, 6, 5]) 

> M2[np.arange(M2.shape[0]), z2] 
> array([38, 46, 45, 44, 47, 43])