Numpy elementweise Produkt von 3D-Array

8

Ich habe zwei 3D-Arrays A und B mit Form (N, 2, 2), die ich elementweise mit der N-Achse multiplizieren möchte, mit einem Matrixprodukt auf jeder der 2x2-Matrix. Bei einer Schleifenimplementierung sieht es wie

aus %Vor%

Gibt es eine Möglichkeit, das ohne Schleifen zu machen? Ich habe mir Tensordot angeschaut, aber ich konnte es nicht zur Arbeit bringen. Ich denke, ich möchte etwas wie tensordot(a, b, axes=([1,2], [2,1])) , aber das gibt mir eine NxN-Matrix.

    
Remy 12.08.2015, 06:17
quelle

2 Antworten

9

Es scheint, dass Sie für jede Schicht entlang der ersten Achse Matrix-Multiplikationen durchführen. Für dasselbe können Sie np.einsum so verwenden -

%Vor%

Runtime testet und verifiziert Ergebnisse -

%Vor%     
Divakar 12.08.2015, 07:30
quelle
0

Sie müssen nur die erste Dimension Ihrer Tensoren ausführen, die mit 0 :

gekennzeichnet ist %Vor%

Dies wird funktionieren, wie Sie es wünschen. Außerdem benötigen Sie keine Achsenliste, da es nur entlang einer Dimension ausgeführt wird. Mit axes([1,2],[2,1]) multipliziert man die 2. und 3. Dimension. Wenn Sie es in Indexnotation (Einstein-Summierungskonvention) schreiben, entspricht dies c[i,j] = a[i,k,l]*b[j,k,l] , also ziehen Sie die Indizes zusammen, die Sie behalten möchten.

EDIT: Ok, das Problem ist, dass das Tensor-Produkt eines zwei 3D-Objekts ein 6D-Objekt ist. Da Kontraktionen Indexpaare beinhalten, gibt es keine Möglichkeit, ein 3D-Objekt durch eine tensordot -Operation zu erhalten. Der Trick besteht darin, Ihre Berechnung in zwei Teile aufzuteilen: Zuerst machen Sie die tensordot auf dem Index, um die Matrixoperation auszuführen, und dann nehmen Sie eine Tensordiagonale, um Ihr 4d-Objekt auf 3d zu reduzieren. In einem Befehl:

%Vor%

In der Tensornotation d[i,j,k] = c[i,j,i,k] = a[i,j,l]*b[i,l,k] .

    
Mattia 12.08.2015 07:45
quelle