Python での NumPy dot と matmul

Manav Narula 2021年3月24日
Python での NumPy dot と matmul

Python では、配列はベクトルとして扱われます。2 次元配列は行列とも呼ばれます。Python でそれらの間の乗算を実行するために使用できる関数があります。使用される 2つのメソッドは、numpy.dot() 関数と@演算子(配列の __matmul__ メソッド)です。今では、どちらも同じ乗算機能を実行しているように見えるかもしれません。ただし、このチュートリアルで説明されているように、両方の間にいくつかの違いがあります。

numpy.dot() 関数は、Python で行列の乗算を実行するために使用されます。また、行列の乗算の条件もチェックします。つまり、最初の行列の列の数は、2 番目の行列の行の数と等しくなければなりません。多次元配列でも機能します。結果を格納するパラメータとして代替配列を指定することもできます。乗算の@演算子は、同じ乗算を実行するために使用される配列の matmul() 関数を呼び出します。例えば、

import numpy as np

a = np.array([[1, 2], [2, 3]])
b = np.array(([8, 4], [4, 7]))
print(np.dot(a, b))
print(a @ b)

出力:

[[16 18]
 [28 29]]
[[16 18]
 [28 29]]

ただし、多次元配列(N> 2 の N-D 配列)を扱う場合、結果はわずかに異なります。以下に違いがあります。

a = np.random.rand(2, 3, 3)
b = np.random.rand(2, 3, 3)
c = a @ b
d = np.dot(a, b)
print(c, c.shape)
print(d, d.shape)

出力:

[[[0.63629871 0.55054463 0.22289276]
  [1.27578425 1.13950519 0.55370078]
  [1.37809353 1.32313811 0.75460862]]

 [[1.63546361 1.54607801 0.67134528]
  [1.05906619 1.07509384 0.42526795]
  [1.38932102 1.32829749 0.47240808]]] (2, 3, 3)
[[[[0.63629871 0.55054463 0.22289276]
   [0.7938068  0.85668481 0.26504028]]

  [[1.27578425 1.13950519 0.55370078]
   [1.55589497 1.45794424 0.5335743 ]]

  [[1.37809353 1.32313811 0.75460862]
   [1.60564885 1.39494713 0.59370927]]]


 [[[1.48529826 1.55580834 0.96142976]
   [1.63546361 1.54607801 0.67134528]]

  [[0.94601586 0.97181894 0.56701004]
   [1.05906619 1.07509384 0.42526795]]

  [[1.13268609 1.00262696 0.47226983]
   [1.38932102 1.32829749 0.47240808]]]] (2, 3, 2, 3)

matmul() 関数は、最後の 2つのインデックスにそれぞれ存在する要素として、行列のスタックのように配列をブロードキャストします。一方、numpy.dot() 関数は、最初の配列の最後の軸と 2 番目の配列の最後から 2 番目の軸の積の合計として乗算を実行します。

matmul()numpy.dot 関数のもう 1つの違いは、matmul() 関数は配列とスカラー値の乗算を実行できないことです。

著者: Manav Narula
Manav Narula avatar Manav Narula avatar

Manav is a IT Professional who has a lot of experience as a core developer in many live projects. He is an avid learner who enjoys learning new things and sharing his findings whenever possible.

LinkedIn