ベクトルの直積

ベクトルの直積

ベクトルの直積

直積の定義

 ベクトル $\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]]