『Python数値計算ノート』ではアフィリエイトプログラムを利用して商品を紹介しています。

ベクトルの直積

ベクトルの直積

ベクトル $\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 の直積を演算します。

# numpy_outer

# In[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]]
'''

次元の等しいベクトル同士の直積は、演算順序を変えても実行結果は同じです。

# In[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() によって「除算表」を生成できます。
 
関数を使わなくても、直積は * 演算子による列ベクトルと行ベクトルの積 (アダマール積 のブロードキャスト) によって得られます。

# In[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]]

コメント