ベクトルの大きさと単位ベクトル

ベクトルの大きさと単位ベクトル

ベクトルの大きさ

ユークリッドノルム

 2 次元ベクトル $\boldsymbol{v}=\begin{bmatrix}v_1\\v_2\end{bmatrix}$ の大きさ(長さ)は
 
\[\parallel\boldsymbol{v}\parallel=\sqrt{v_1^2+v_2^2}\]
によって定義されます。$n$ 次元ベクトルについても同様に、
 
\[\parallel\boldsymbol{v}\parallel=\sqrt{v_1^2+v_2^2+\ \cdots\ +v_n^2}\tag{1}\]
と定義します。一般に (1) によって定義された量を ユークリッドノルム (Euclidean norm) とよびます。ユークリッドノルムは numpy.sqrt() と numpy.sum() を使って実装できます。

# リストSLA02-A-1

import numpy as np

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

# ベクトルvの大きさ(ノルム)を計算
v_n = np.sqrt(np.sum(v**2))

print("|v| = {:.3f}".format(v_n))
|v| = 3.742

 

scipy.linalg.norm()

 scipy.linalg.norm() を使ってベクトルの大きさを計算することができます。

 scipy.linalg.norm(a, ord=None, axis=None, keepdims=False)

 第 1 引数 a にベクトル (1次元配列) を渡すと、ベクトルの大きさ (ユークリッドノルム) を返します。

# リストSLA02-B-1

import numpy as np
from scipy.linalg import norm

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

# ベクトルvの大きさ(ノルム)を計算
v_n = norm(v)

print("|v| = {:.3f}".format(v_n))
|v| = 3.742

 第 1 引数に 2 次元配列を渡して axis で軸を指定すると、軸に沿ってノルムを計算します。
 たとえば、ベクトル [1 2 3] の大きさと、ベクトル [4 5 6] の大きさをまとめて計算することができます:

# リストSLA02-B-2

# 2次元配列を定義
a = np.array([[1, 2, 3],
              [4, 5, 6]])

# 第1軸(横軸)に沿ってノルムを計算
a_n = norm(a, axis = 1)

# 数値を丸める
a_n = np.round(a_n, 3)

print("|a_n| = {}".format(a_n))
|a_n| = [3.742 8.775]

 NumPy にも numpy.linalg.norm() という関数が用意されていますが、機能は scipy.linalg.norm() とほとんど同じなので解説は割愛します。
 

単位ベクトル

 長さ $1$ のベクトルは 単位ベクトル とよばれます。
 任意のベクトル $\boldsymbol{v}$ を自身の長さ $\parallel\boldsymbol{v}\parallel$ で割れば単位ベクトルとなります。

 たとえば、$\boldsymbol{v}=\begin{bmatrix}1\\1\end{bmatrix}$ の長さは $\sqrt{1^2+1^2}=\sqrt{2}$ なので、
 
\[\boldsymbol{u}=\frac{1}{\sqrt{2}}\begin{bmatrix}1\\1\end{bmatrix}\]
は単位ベクトルです。

# リストSLA02-C-1

import numpy as np
from scipy.linalg import norm

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

# 単位ベクトルを作成
u = v / norm(v)

print(u)
[0.707 0.707]