In [78]: A=np.arange(2*3*4*5).reshape(2,3,4,5)
In [79]: B=np.arange(4*5).reshape(4,5)
In [81]: np.einsum('...ij,ij',A,B)
Out[81]:
array([[ 2470, 6270, 10070],
[13870, 17670, 21470]])
In [82]: np.tensordot(A,B,((2,3),(0,1)))
Out[82]:
array([[ 2470, 6270, 10070],
[13870, 17670, 21470]])
tensordot
dot
が処理できる2dに問題を低減するために変形(及び軸スワップ)を使用:全体寸法場合
In [83]: A1=A.reshape(2*3,4*5)
In [84]: B1=B.reshape(4*5)
In [85]: C1=np.dot(A1,B1)
In [86]: C1.reshape(2,3)
Out[86]:
array([[ 2470, 6270, 10070],
[13870, 17670, 21470]])
、ひいてはアレイのサイズが大きすぎると、einsum
は、メモリの問題を有することになります。まあ、どちらもできます。
...
は、可変数N
の数値を処理できますが、M
のディメンションについて具体的に示す必要があります。 (理論的には、プログラムでij
の文字列を構築することができます)
柔軟性とパワーを最大限に引き出すには、['numpy.einsum'](https://docs.scipy.org/doc/numpy/reference/)を試してみてください。 generated/numpy.einsum.html)。 – Evert