2013-11-21 7 views
5

Ich habe eine N-dimensionale Matrix, die die Werte für eine Funktion mit N Parametern enthält. Jeder Parameter hat eine diskrete Anzahl von Werten. Ich muss die Funktion über alle Parameter bis auf einen maximieren, was zu einem eindimensionalen Vektor der Größe führt, der gleich der Anzahl der Werte des nicht maximierten Parameters ist. Ich muss auch speichern, welche Werte von den anderen Parametern genommen werden.Erhalte Indizes von numpy.argmax Elementen über eine Achse

Dazu wollte ich iterativ numpy.max über verschiedene Achsen anwenden, um die Dimensionalität der Matrix zu reduzieren, um zu finden, was ich brauche. Der endgültige Vektor wird dann nur von dem Parameter abhängen, den ich weggelassen habe.

Ich habe jedoch Probleme, die ursprünglichen Indizes der letzten Elemente zu finden (die die Informationen über die Werte enthalten, die von den anderen Parametern genommen werden). Ich über die Verwendung von numpy.argmax in der gleichen Weise wie numpy.max, aber ich kann nicht die ursprünglichen Indizes zurück erhalten.

Ein Beispiel dafür, was ich versuche:

x = [[[1,2],[0,1]],[[3,4],[6,7]]] 
args = np.argmax(x, 0) 

Das gibt

[[1 1] 
[1 1]] 

was bedeutet, dass argmax die Elemente auswählt (2,1,4,7) innerhalb der ursprünglichen Matrix. Aber wie bekommt man ihre Indizes? Ich versuchte unravel_index, mit der args direkt als Index für die Matrix x, eine Reihe von Funktionen von numpy Index ohne Erfolg.

Die Verwendung von numpy.where ist keine Lösung, da die Eingabematrix im Inneren gleiche Werte haben kann, so dass ich nicht von verschiedenen Originalwerten unterscheiden könnte.

Antwort

6

x.argmax(0) gibt die Indizes entlang der 1. Achse für die Maximalwerte an. Verwenden Sie np.indices, um die Indizes für die andere Achse zu generieren.

x = np.array([[[1,2],[0,1]],[[3,4],[6,7]]]) 
x.argmax(0) 
    array([[1, 1], 
      [1, 1]]) 
a1, a2 = np.indices((2,2)) 
(x.argmax(0),a1,a2) 
    (array([[1, 1], 
      [1, 1]]), 
    array([[0, 0], 
      [1, 1]]), 
    array([[0, 1], 
      [0, 1]])) 


x[x.argmax(0),a1,a2] 
    array([[3, 4], 
      [6, 7]]) 

x[a1,x.argmax(1),a2] 
    array([[1, 2], 
      [6, 7]]) 

x[a1,a2,x.argmax(2)] 
    array([[2, 1], 
      [4, 7]]) 

Wenn x andere Abmessungen hat, erzeugen a1 und a2 angemessen.

Die offizielle Dokumentation sagt nicht viel über die Verwendung argmax, aber frühere SO-Threads haben es diskutiert. Ich habe diese allgemeine Idee von Using numpy.argmax() on multidimensional arrays