ベクトルとスカラー

ベクトルとスカラー

ベクトルと1次元配列

 SciPy および NumPy の公式ドキュメントでは、1 次元配列 (1-D array) のことを ベクトル(vector) と表現しています。実際、1 次元配列を受け取ってベクトル演算を実行するために、あらゆる種類の関数やメソッドが用意されています。しかし、演算子の使い方については、いくつかの点で注意が必要です。

加算と減算

 ベクトルの加算・減算は、成分ごとの加算・減算として定義されています。
 
\[\begin{bmatrix}v_1\\v_2\\v_3\end{bmatrix}\pm\begin{bmatrix}w_1\\w_2\\w_3\end{bmatrix}
=\begin{bmatrix}v_1\pm w_1\\v_2\pm w_2\\v_3\pm w_3\end{bmatrix}\]
 この操作は配列の演算規則と同じなので、そのまま適用できます。

# リストSLA01-A-1
# ベクトルの加算と減算

import numpy as np

# ベクトルを定義
v = np.array([1, 2, 3])
w = np.array([4, 5, 6])

# 加算と減算
t = v + w
u = w - v

print("v + w = {}".format(t))
print("w - v = {}".format(u))
v + w = [5 7 9]
w - v = [3 3 3]

 

乗算と除算

 ベクトルの積は内積と外積の 2 種類が定義されています。+ 演算子にる配列の積は要素同士を掛け算する直積で、これは内積・外積のいずれとも異なる演算です(内積と外積はメソッドもしくは関数として用意されています)。

# リストSLA01-A-2

# ベクトルを定義
v = np.array([10, 20, 30])
w = np.array([2, 4, 6])

# 乗算
t = v * w

print("vw = {}".format(t))
v * w = [ 20  80 180]

 ベクトル同士の除算は定義されていませんが、/ 演算子で配列同士の除算を実行すると成分ごとに除算して返します。

# リストSLA01-A-3

# ベクトルを定義
v = np.array([10, 20, 30])
w = np.array([2, 4, 6])

# 除算
u = v / w

print("v/w = {}".format(u))
v/w = [5. 5. 5.]

 

ベクトルとスカラー

 ベクトル $\boldsymbol{v}$ とスカラー $p$ の積は、ベクトルを構成するすべての成分(要素)を $p$ 倍する操作として定義されています。
 
\[p\boldsymbol{v}
=p\begin{bmatrix}v_1\\v_2\\v_3\end{bmatrix}
=\begin{bmatrix}pv_1\\pv_2\\pv_3\end{bmatrix}\]
 この操作は配列でも同じです。

# リストSLA01-A-4

# ベクトルを定義
v = np.array([1, 2, 3])

# ベクトルvにスカラー10を掛ける
u = 10 * v

print("10 * v = {}".format(u))
10 * v = [10 20 30]

 ベクトルとスカラーの間で加算・減算は定義されていませんが、1 次元配列 v にスカラー p を加えると、配列のすべての要素に p を加えます。

# リストSLA01-A-5

# ベクトルを定義
v = np.array([1, 2, 3])

# vにスカラー1を加える
u = v + 1

print("v + 1 = {}".format(u))
v + 1 = [2 3 4]

 これは配列のブロードキャスト機能による演算結果です。
 ベクトルとスカラーの足し算を行なっているのではなく、すべての要素が 1 であるベクトルを作って、ベクトル同士の足し算を行なっています。
 

テンソル

 厳密には、ベクトル1 階のテンソル として定義されます。
 テンソルとはスカラー、ベクトル、行列をすべて含む汎用概念です。
 NumPy の配列はテンソルに近い構造で設計されていて、関数やメソッドの中にはテンソル演算として定義されているものがいくつかあります。

 おそらく無用な混乱を避けるためだと思われますが、公式ドキュメントではテンソルという用語はあまり使われていません。そのため、ベクトルの内積を計算すると説明されている関数に行列 (2次元配列) を渡すと、内積とも行列積とも異なる不可解な演算結果を返したりするので、困惑することがしばしばあります。

 テンソルは高度な概念ですが、使いこなせばとても効率的なコードを書くことができます。機械学習用ライブラリとして有名な TensorFlow も、その名が示すように Tensor (テンソル) 演算をベースに設計されています。