NumPyでベクトルの長さを1に正規化


このエントリーをはてなブックマークに追加

NumPyでベクトルの長さを1に正規化するには、np.linalg.normを使います。

ベクトルの例

例えば、要素数3のベクトルの長さ(より正確には、ユークリッド距離。すなわちL2ノルム)を1に正規化するには以下のようにします。

vec = np.array([3.0, 4.0, 5.0])
unit_vec = vec / np.linalg.norm(vec, ord=2)  # ordは省略可
print(unit_vec)  # [0.42426407 0.56568542 0.70710678] と表示

検算すると sqrt(0.42426407 ^ 2 + 0.56568542 ^ 2 + 0.70710678 ^ 2) ≒ 1.0で、たしかに正規化できています。

行列の例

素数3の横ベクトルが縦に2つ並んだ行列(shapeが(2, 3))について、横ベクトルそれぞれのL2ノルムを1に正規化する例を以下に示します。

arr = [[3.0, 4.0, 5.0],
       [1.0, 2.0, 3.0]]
arr /= np.linalg.norm(arr, ord=2, axis=1, keepdims=True)
print(arr)

出力結果は以下です。

[[0.42426407 0.56568542 0.70710678]
 [0.26726124 0.53452248 0.80178373]]

素数3の縦ベクトルが横に2つ並んだ行列(shapeが(3, 2))について、縦ベクトルそれぞれのL2ノルムを1に正規化する例を以下に示します。

arr = [[3.0, 1.0],
       [4.0, 2.0],
       [5.0, 3.0]]
arr /= np.linalg.norm(arr, ord=2, axis=0, keepdims=True)
print(arr)

出力結果は以下です。

[[0.42426407 0.26726124]
 [0.56568542 0.53452248]
 [0.70710678 0.80178373]]