2017-03-27 3 views
0

Ich muss Elemente der Spalten in der Matrix "A" (3D-Matrix von Achse 0) per 2D-Permutationsmatrix "Pi" aus Argsort, die neue Indizes für alle Spalten enthält permutieren. Durch Anwendung Permutationsmatrix "Pi" auf der Matrix "A" (A [Pi]) Ich werde 4D-Matrix mit neuer Form erhalten. Zum Beispiel ist die Form (A) (2,3,4) und die Form (A & pgr;) ist (2,3,3,4). Ich bin in der Lage, die benötigte sortierte Matrix aus A [pi] per Befehl zu extrahieren: swapaxes (diagonal (A [pi], axis1 = 2, axis2 = 1), 1,2) Aber IMHO scheint es zu kompliziert und langsam. Gibt es eine andere elegante Lösung?numpy Array Permutation Spalten 3D-Matrix mit Argsort

Beispiel:

print(A) 
[[[ 73 701 2411 2414] 
    [ 5515 8292 8414 16135] 
    [ 100 1241 2146 2931]] 

[[ 1335 1747 3418 6312] 
    [ 3788 5449 5753 9738] 
    [ 565 3038 3800 5430]]] 

pi=argsort(Norm_order(A),0) 

print(pi) 
[[1, 0, 1], 
[0, 1, 0]] 

print(swapaxes(diagonal(A[pi],axis1=2,axis2=1),1,2)) 
[[[ 1335 1747 3418 6312] 
    [ 5515 8292 8414 16135] 
    [ 565 3038 3800 5430]] 

[[ 73 701 2411 2414] 
    [ 3788 5449 5753 9738] 
    [ 100 1241 2146 2931]]] 
+0

Dankten Hilfe Willem :) . Ich bin neu hier. –

Antwort

0

Vielleicht eine Frage des Geschmacks, aber ich finde die folgende etwas besser lesbar:

i, j = np.ogrid[:3, :4] 
A[pi[..., None], i, j] 

Ausgang:

array([[[ 1335, 1747, 3418, 6312], 
     [ 5515, 8292, 8414, 16135], 
     [ 565, 3038, 3800, 5430]], 

     [[ 73, 701, 2411, 2414], 
     [ 3788, 5449, 5753, 9738], 
     [ 100, 1241, 2146, 2931]]]) 
+0

Danke. Lesbarer und 1,4-mal schneller. –