<目次>
matmulとdotの違いについて(Pythonのnumpy・tensorflow)
(1-1) 両者の違い
(1-2) 両者の違い(実機確認)
matmulとdotの違いについて(Pythonのnumpy・tensorflow)
(1-1) 両者の違い
| 次元 (行列1\行列2) |
n=1 | n=2 | n>2 |
| n=1 (例:[1]) |
① 差異なし |
② 差異なし |
③ 差異なし |
| n=2 (例:[[1],[1]]) |
④ 差異なし |
⑤ 差異なし |
⑥ ▲差異あり ⇒詳細は「numpyの記事(★)」と「dotの記事(★)」を参照 |
| n>2 (例:[[[1],[1]],[[1],[1]]]) |
⑤ 差異なし |
⑧ ▲差異あり ⇒詳細は「numpyの記事(★)」と「dotの記事(★)」を参照 |
⑨ ▲差異あり ⇒詳細は「numpyの記事(★)」と「dotの記事(★)」を参照 |
| 次元 (行列1\行列2) |
n=1 | n=2 | n>2 |
| n=1 (例:[1]) |
① ▲差異あり ⇒tensorflowはエラー。numpyはベクトル内積計算。 |
② ▲差異あり ⇒tensorflowはエラー。numpyはベクトル内積計算。 |
③ ▲差異あり ⇒tensorflowはエラー。numpyはベクトル内積計算。 |
| n=2 (例:[[1],[1]]) |
④ ▲差異あり ⇒tensorflowはエラー。numpyはベクトル内積計算。 |
⑤ 差異なし |
⑥ 差異なし |
| n>2 (例:[[[1],[1]],[[1],[1]]]) |
⑦ ▲差異あり ⇒tensorflowはエラー。numpyはベクトル内積計算。 |
⑧ 差異なし |
⑨ 差異なし |
(1-2) 両者の違い(実機確認)
import numpy as np
def main():
a_1d_2 = np.array([1,2])
a_2d_1x2 = np.array([[1,2]])
a_2d_2x1 = np.array([[1],[2]])
a_3d_2x1x2 = np.array([[[1,2]],[[1,2]]])
a_3d_2x2x1 = np.array([[[1],[2]],[[1],[2]]])
print("①:",np.dot(a_1d_2,a_1d_2))
print("②:",np.dot(a_1d_2,a_2d_2x1))
print("③:",np.dot(a_1d_2,a_3d_2x2x1))
print("④:",np.dot(a_2d_1x2,a_1d_2))
print("⑤:",np.dot(a_2d_1x2,a_2d_2x1))
print("⑦:",np.dot(a_3d_2x1x2,a_1d_2))
print("⑥:",np.dot(a_2d_1x2,a_3d_2x2x1))
print("⑧:",np.dot(a_3d_2x2x1,a_2d_1x2))
print("⑨:",np.dot(a_3d_2x2x1,a_3d_2x1x2))
if __name__ == "__main__":
main()
(実行結果)
①: 5 ②: [5] ③: [[5] [5]] ④: [5] ⑤: [[5]] ⑦: [[5] [5]] ⑥: [[[5] [5]]] ⑧: [ [[1 2] [2 4]] [[1 2] [2 4]] ] ⑨: [ [ [[1 2] [1 2]] [[2 4] [2 4]] ] [ [[1 2] [1 2]] [[2 4] [2 4]] ] ]
(図121)

import numpy as np
def main():
a_1d_2 = np.array([1,2])
a_2d_1x2 = np.array([[1,2]])
a_2d_2x1 = np.array([[1],[2]])
a_3d_2x1x2 = np.array([[[1,2]],[[1,2]]])
a_3d_2x2x1 = np.array([[[1],[2]],[[1],[2]]])
print("①:",np.matmul(a_1d_2,a_1d_2))
print("②:",np.matmul(a_1d_2,a_2d_2x1))
print("③:",np.matmul(a_1d_2,a_3d_2x2x1))
print("④:",np.matmul(a_2d_1x2,a_1d_2))
print("⑤:",np.matmul(a_2d_1x2,a_2d_2x1))
print("⑦:",np.matmul(a_3d_2x1x2,a_1d_2))
print("⑥:",np.matmul(a_2d_1x2,a_3d_2x2x1))
print("⑧:",np.matmul(a_3d_2x2x1,a_2d_1x2))
print("⑨:",np.matmul(a_3d_2x2x1,a_3d_2x1x2))
if __name__ == "__main__":
main()
(実行結果)
①: 5 ②: [5] ③: [[5] [5]] ④: [5] ⑤: [[5]] ⑦: [[5] [5]] ⑥: [[[5]] [[5]]] ⑧: [ [[1 2] [2 4]] [[1 2] [2 4]] ] ⑨: [ [[1 2] [2 4]] [[1 2] [2 4]] ]
(図122)

import tensorflow as tf
import numpy as np
def main():
a_1d_2 = np.array([1,2])
a_2d_1x2 = np.array([[1,2]])
a_2d_2x1 = np.array([[1],[2]])
a_3d_2x1x2 = np.array([[[1,2]],[[1,2]]])
a_3d_2x2x1 = np.array([[[1],[2]],[[1],[2]]])
# print("①:",tf.matmul(a_1d_2,a_1d_2).numpy())
# print("②:",tf.matmul(a_1d_2,a_2d_2x1).numpy())
# print("③:",tf.matmul(a_1d_2,a_3d_2x2x1).numpy())
# print("④:",tf.matmul(a_2d_1x2,a_1d_2).numpy())
# print("⑦:",tf.matmul(a_3d_2x1x2,a_1d_2).numpy())
print("⑤:",tf.matmul(a_2d_1x2,a_2d_2x1).numpy())
print("⑥:",tf.matmul(a_2d_1x2,a_3d_2x2x1).numpy())
print("⑧:",tf.matmul(a_3d_2x2x1,a_2d_1x2).numpy())
print("⑨:",tf.matmul(a_3d_2x2x1,a_3d_2x1x2).numpy())
if __name__ == "__main__":
main()
(実行結果)
①:エラー(In[0] and In[1] ndims must be >= 2) ②:エラー(In[0] and In[1] has different ndims: [2] vs. [2,1]) ③:エラー(In[0] ndims must be >= 2) ④:エラー(In[0] and In[1] has different ndims: [1,2] vs. [2]) ⑦:エラー(In[1] ndims must be >= 2) ⑤: [[5]] ⑥: [[[5]] [[5]]] ⑧: [ [[1 2] [2 4]] [[1 2] [2 4]] ] ⑨: [ [[1 2] [2 4]] [[1 2] [2 4]] ]
(図123)
