Ein Bekannter fragte mich, wie man ein dreidimensionales Array einfach multiplizieren könne, und als ich es nachschlug, gab es in der Numpy-Bibliothek ein Einsum, das Einsteins Abkürzungen verwendete, und ich dachte, es wäre einfacher, dies zu tun. ..
Erstellen Sie zunächst zwei 1x2x5 3D-Matrizen und eine 2x3x5 3D-Matrix.
A =
\left(
\begin{matrix}
a_0 & a_1
\end{matrix}
\right)
, a_0 =
\left[
\begin{matrix}
0 & 1 & 1 & 0 & 0
\end{matrix}
\right]
, a_1 =
\left[
\begin{matrix}
0 & 1 & 0 & 0 & 1
\end{matrix}
\right]
W =
\left(
\begin{matrix}
w_0 & w_1 & w_2 \\
w_3 & w_4 & w_5
\end{matrix}
\right)
, w_0 =
\left[
\begin{matrix}
0 & 1 & 2 & 3 & 4
\end{matrix}
\right]
, w_1 =
\left[
\begin{matrix}
5 & 6 & 7 & 8 & 9
\end{matrix}
\right]
...
Wenn Sie dies mit numpy erstellen,
A = np.array([[[0,1,1,0,0],
[0,1,0,0,1]]])
W = np.arange(30).reshape(2,3,5)
Sie können es mit tun.
Die Form der Matrix von A (1, 2, 5) wird durch Einsteins Reduktionssymbol (i, j, k) dargestellt. In ähnlicher Weise wird die Form der W-Matrix (2, 3, 5) durch (j, l, k) dargestellt.
Das Multiplizieren dieser beiden Matrizen sollte zu einer Matrix von (1,3,5) führen, daher lautet die Formel mit einsum wie folgt.
R = np.einsum("ijk,jlk -> ilk",A,W)
print(R)
print(R.shape)
Bei der Ausführung wird R so.
[[[ 0 17 2 0 19]
[ 0 27 7 0 24]
[ 0 37 12 0 29]]]
(1,3,5)
Das Ergebnis ist eine 1x3x5 3D-Matrix.
Referenz (Englisch):