ベクトルの直積
直積の定義
ベクトル $\boldsymbol{a}$ と $\boldsymbol{b}$ のテンソル積 $\boldsymbol{a}\boldsymbol{b}^T$ を 直積 (direct product) または外積 (outer product) とよび、$\boldsymbol{a}\otimes\boldsymbol{b}$ で表します。ただし外積はベクトル積の意味で用いられることもあるので、混乱を避けるために当サイトでは「直積」とよぶことにします。
$m$ 次元ベクトルと $n$ 次元ベクトルの直積は $m\times n$ の行列です。たとえば、$3$ 次元ベクトル $\boldsymbol{a}$ と $2$ 次元ベクトル $\boldsymbol{b}$ の直積 $\boldsymbol{a}\otimes\boldsymbol{b}$ をとると、$3\times 2$ の行列となります:
\[\boldsymbol{a}\otimes\boldsymbol{b}=
\begin{bmatrix}a_{1}\\a_{2}\\a_{3}\end{bmatrix}
\begin{bmatrix}b_{1}&b_{2}\end{bmatrix}=
\begin{bmatrix}
a_1 b_1&a_1 b_2\\
a_2 b_1&a_2 b_2\\
a_3 b_1&a_3 b_2\end{bmatrix}\]
より一般的には、直積はクロネッカー積 $A\otimes B$ において。$A,\ B$ をベクトルに限定した演算です。
numpy.outer()
numpy.outer(a, b) はベクトル a, b の 直積 を演算します。
# SLA_102-1
import numpy as np
a = np.array([1, 2, 3])
b = np.array([10, 20])
# aとbの直積を計算
x = np.outer(a, b)
y = np.outer(b, a)
print("x:\n{}".format(x))
print("y:\n{}".format(y))
x: [[10 20] [20 40] [30 60]] y: [[10 20 30] [20 40 60]]
次元の等しいベクトル同士の直積は、演算順序を変えても実行結果は同じです。
# SLA_102-2
c = np.array([1, 2, 3])
d = np.array([10, 20, 30])
# cとdの直積を計算
x = np.outer(c, d)
y = np.outer(c, d)
print("x:\n{}".format(x))
print("y:\n{}".format(y))
x: [[10 20 30] [20 40 60] [30 60 90]] y: [[10 20 30] [20 40 60] [30 60 90]]
直積とは、いわゆる「乗算表」をつくる演算です。
numpy.outer() は numpy.multiply.outer() と同じ演算です。
outer() はユニバーサル関数 (ufunc) に備えられた一般的な演算表を生成するメソッドであり、たとえば numpy.divide.outer() によって「除算表」を生成できます。
関数を使わなくても、直積は * 演算子による列ベクトルと行ベクトルの積 (アダマール積のブロードキャスト) によって得られます。
# SLA_102-3
# 列ベクトル
a = np.array([1, 2, 3]).reshape(-1, 1)
# 行ベクトル
b = np.array([10, 20])
# aとbの直積
print(a * b)
[[10 20] [20 40] [30 60]]
コメントを書く