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.
Sie müssen nur die erste Dimension Ihrer Tensoren ausführen, die mit 0
:
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:
In der Tensornotation d[i,j,k] = c[i,j,i,k] = a[i,j,l]*b[i,l,k]
.
Tags und Links python arrays numpy matrix vectorization