numpy.dot
は、ベクトルの内積(ドット積)を求めるための関数です。このページでは、これの使い方について詳しく解説します。それでは解説を始めましょう。
1. ベクトルの内積とは
ベクトルの内積 \(\vec{v}\cdot\vec{w}\) とは、一言でいうと \(\vec{v}\) に対する \(\vec{w}\) の射影の長さです。以下のアニメーションで簡単に表しています。
詳しい解説は『ベクトルの内積とは?その意味と計算方法』で行っているので、ぜひご覧ください。
計算方法は以下の通りです。
2次元ベクトルの内積の計算方法
\[
\vec{v}\cdot\vec{w}=
\left[ \begin{array}{cc} v_1 \\ v_2 \end{array} \right]
\cdot
\left[ \begin{array}{cc} w_1 \\ w_2 \end{array} \right]
=v_1\cdot w_1+ v_2\cdot w_2
\]
3次元ベクトルの内積の計算方法
\[
\vec{v}\cdot\vec{w}=
\left[ \begin{array}{cc} v_1 \\ v_2 \\ v_3\end{array} \right]
\cdot
\left[ \begin{array}{cc} w_1 \\ w_2 \\ w_3 \end{array} \right]
=v_1\cdot w_1+ v_2\cdot w_2 + v_3\cdot w_3
\]
numpy.dot
は、このベクトルの内積を求めるための関数です。それでは次から使い方を見ていきましょう。
2. numpy.dot の使い方
numpy.dot
の書き方は以下の通りです。
書き方
np.dot(a, b, out=None)
パラメーター
引数 | 型 | 解説 |
---|---|---|
a | array_like | 第一引数。1次元配列を渡す。 |
b | array_like | 第二引数。1次元配列を渡す。 |
out* | ndarray | これを指定した場合、指定した配列をドット積を行った新しい配列で上書きします。ここに指定する配列は、生成される配列と同じshape, dtypeで、必ずC言語方式のメモリレイアウトである必要があります。それらが一致しない場合はエラーになります。 |
* はオプション引数であることを示します。 |
公式ドキュメント:numpy.dot
オプション引数の out は使う機会は少ないため、基本的には1次元配列 a とb を渡すだけです。それではサンプルコードを見て、使い方を確認しましょう。
2次元ベクトルの内積を取得
まずは2次元ベクトル同士の内積を取得してみましょう。次のように書きます。なお numpy の配列では、ベクトルは横ベクトルで表します。
import numpy as np
v=np.array([1,0])
w=np.array([2, -1])
np.dot(v, w)
ベクトルの内積 2 が出力されました。
3次元ベクトルの内積を取得
続いて3次元ベクトルの内積も取得してみましょう。
import numpy as np
v=np.array([2,1,3])
w=np.array([1, -2, -1])
np.dot(v, w)
ベクトルの内積−3が出力されました。
注意点
numpy.dot
がベクトルの内積を返すのは、1次元配列同士の演算の場合です。numpy では1次元配列がベクトルを表すからです。
2次元以上の配列を渡した場合は、以下のようになります。
a | b | 戻り値 |
---|---|---|
2次元配列 | 2次元配列 | 行列の積 ※np.matmul(a, b) または a@b 推奨 |
0次元配列 | N次元配列 | スカラー倍 ※np.multiply(a, b) または a*b 推奨 |
N次元配列 | 1次元配列 | a の1次元軸の要素とb との内積の和 |
N次元配列 | M次元配列 | a の1次元軸の要素とb の2次元軸の要素の内積の和 |
ただし混乱を防ぐために、numpy.dot
は基本的にベクトルの内積を求める目的で使うべきです。行列の積には、numpy.matmul
を、スカラー倍には numpy.multiply
を使うようにしましょう。
また numpy.dot
では複素共役を取得することはできません。この場合は numpy.vdot
を使います。
3. numpy.vdot の使い方
書き方は numpy.dot
とまったく同じです。
サンプルコードで確認していきましょう。
2次元ベクトルの内積(複素共役)
以下の通り、複素共役を取得することができます。
import numpy as np
v=np.array([1+2j, 2+1j])
w=np.array([1+1j, 2+2j])
vw=np.vdot(v, w)
wv=np.vdot(w,v)
print(vw, wv)
# numpy.dot との比較
np.dot(v,w)
3次元ベクトルの内積(複素共役)
念のため3次元ベクトルの場合も見ておきましょう。
import numpy as np
v=np.array([1+2j, 2+1j, 3+1j])
w=np.array([3+2j, 1+1j, 2+2j])
vw=np.vdot(v, w)
wv=np.vdot(w,v)
print(vw, wv)
# numpy.dot との比較
np.dot(v,w)
4. まとめ
以上が numpy.dot
の使い方です。混乱される方が多いので、もう一度、確認表を載せておきます。ただし、numpy.dot
は基本的に1次元配列同士の場合(ベクトルの内積を取得する場合)に使うようにして、それ以外の目的での使用は控えましょう。
a | b | 戻り値 |
---|---|---|
1次元配列 | 1次元配列 | ベクトルの内積(複素共役は×) |
2次元配列 | 2次元配列 | 行列乗算 ※np.matmul(a, b) または a@b 推奨 |
0次元配列 | N次元配列 | スカラー乗算 ※np.multiply(a, b) または a*b 推奨 |
N次元配列 | 1次元配列 | a の1次元軸の要素とb との内積 |
N次元配列 | M次元配列 | a の1次元軸の要素とb の2次元軸の要素の内積 |
コメント