ベクトルの直積
ベクトル $\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]]
コメント