@ajcrの答えは、dot
とmatmul
(@
記号で呼び出される)の違いを説明しています。簡単な例を見ると、「行列のスタック」またはテンソルを操作するときに2つがどのように異なる動作をするかがはっきりとわかります。
違いを明確にするために、4x4配列を取り、3x4x2の「行列のスタック」またはテンソルを使用してdot
積とmatmul
積を返します。
import numpy as np
fourbyfour = np.array([
[1,2,3,4],
[3,2,1,4],
[5,4,6,7],
[11,12,13,14]
])
threebyfourbytwo = np.array([
[[2,3],[11,9],[32,21],[28,17]],
[[2,3],[1,9],[3,21],[28,7]],
[[2,3],[1,9],[3,21],[28,7]],
])
print('4x4*3x4x2 dot:\n {}\n'.format(np.dot(fourbyfour,twobyfourbythree)))
print('4x4*3x4x2 matmul:\n {}\n'.format(np.matmul(fourbyfour,twobyfourbythree)))
各操作の製品を以下に示します。内積がどのようになっているかに注意してください。
... aの最後の軸とbの最後から2番目の軸の合計
マトリックス製品を一緒にブロードキャストすることによってどのように形成されるか。
4x4*3x4x2 dot:
[[[232 152]
[125 112]
[125 112]]
[[172 116]
[123 76]
[123 76]]
[[442 296]
[228 226]
[228 226]]
[[962 652]
[465 512]
[465 512]]]
4x4*3x4x2 matmul:
[[[232 152]
[172 116]
[442 296]
[962 652]]
[[125 112]
[123 76]
[228 226]
[465 512]]
[[125 112]
[123 76]
[228 226]
[465 512]]]