ベクトルの直積
ベクトル $\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]]
【ChatGPT講義】直積
直積(ちょくせき、Cartesian product)は、集合論や数学の一分野で使用される概念です。直積は、2つ以上の集合から新しい集合を構成する操作です。具体的には、集合Aと集合Bの直積(A × B)は、Aの要素とBの要素の組み合わせをすべて含む新しい集合です。直積の要素は順序対(ordered pair)と呼ばれ、(a, b)の形式で表されます。ここで、aは集合Aの要素であり、bは集合Bの要素です。例えば、A = {1, 2}とB = {a, b, c}の場合、AとBの直積は{(1, a), (1, b), (1, c), (2, a), (2, b), (2, c)}となります。この直積は、Aの要素とBの要素を組み合わせた6つの順序対から成り立っています。直積は、数学の多くの分野で使用されます。特に、関数や関係の理論、位相空間、行列の演算などで重要な役割を果たしています。直積の概念は、集合の要素の組み合わせを扱う上で非常に便利であり、数学的な表現や解析の手法を提供します。
【ChatGPT講義】numpy.outer
numpy.outer関数は、NumPyライブラリに含まれる関数の一つです。この関数は、与えられた2つの配列を入力として受け取り、それらの配列の直積を計算します。具体的には、ベクトルAの要素とベクトルBの要素の組み合わせをすべて考慮し、それらの積を計算します。結果は、新しい行列として返されます。この行列の要素は、ベクトルAの要素とベクトルBの要素の積です。numpy.outer(A, B)の呼び出し方を例で説明します。ここでAとBは1次元配列(ベクトル)とします。例えば、A = [1, 2, 3] と B = [4, 5] の場合、numpy.outer(A, B)は以下のように計算されます。
[[ 4 5]
[ 8 10]
[12 15]]
結果は2次元の行列であり、行列の各要素はAとBの要素の積になっています。例えば、行列の要素(2, 1)はAの2番目の要素(2)とBの1番目の要素(4)の積である8となります。このように、numpy.outer関数を使うことで、2つのベクトルの直積を簡単に計算することができます。