Python
 Computer >> コンピューター >  >> プログラミング >> Python

PythonのNumPyでaxis(軸)を指定して行列・ベクトルのノルムを求める方法

PythonのNumPyには線形代数用のモジュール numpy.linalg が用意されており、その中の LA.norm() メソッドを使うことで、行列やベクトルのノルム(大きさ)を簡単に計算できます。本記事では、特に axis 引数 を指定して、多次元配列の各軸に沿ったノルムを求める方法を、具体的なコード例とともに解説します。

LA.norm() メソッドの主な引数

LA.norm() メソッドは、以下の4つの主要な引数を受け取ります。

第1引数: x(入力配列)

ノルムを計算したい入力配列です。axis が None の場合、x は1次元または2次元である必要があります(ただし ord も None の場合を除く)。axisord の両方が None の場合は、x.ravel() の2-ノルムが返されます。

第2引数: ord(ノルムの次数)

計算するノルムの次数(オーダー)を指定します。inf を指定すると、NumPy の np.inf オブジェクトとして扱われ、無限ノルムが計算されます。デフォルト値は None です。

第3引数: axis(計算対象の軸)

axis に整数を指定した場合、その軸に沿ってベクトルノルムが計算されます。2要素のタプルを指定した場合、その軸が2次元行列を保持しているとみなされ、各行列の行列ノルムが計算されます。axis が None の場合は、x が1次元ならベクトルノルム、2次元なら行列ノルムが返されます。デフォルト値は None です。

第4引数: keepdims(次元の保持)

keepdims=True を設定すると、ノルムを計算した軸がサイズ1の次元として結果に残ります。このオプションを有効にすると、元の配列 x に対して結果が正しくブロードキャストされるようになります。

実装手順

ステップ1: 必要なライブラリをインポートする

import numpy as np
from numpy import linalg as LA

ステップ2: 配列を作成する

ここでは、0から7までの整数を持つ配列を作成し、形状 (2, 2, 2) の3次元配列に変形します。

arr = np.arange(8).reshape(2,2,2)

ステップ3: 配列を表示する

print("Our Array...\n",arr)

ステップ4: 次元数を確認する

print("\nDimensions of our Array...\n",arr.ndim)

ステップ5: データ型を確認する

print("\nDatatype of our Array object...\n",arr.dtype)

ステップ6: 形状を確認する

print("\nShape of our Array object...\n",arr.shape)

ステップ7: LA.norm() でノルムを計算する

axis=(1, 2) を指定することで、最後の2つの軸が持つ各2×2行列に対してノルムが計算されます。

print("\nResult...\n",LA.norm(arr, axis = (1, 2)))

完全なコード例

import numpy as np
from numpy import linalg as LA

# 配列を作成
arr = np.arange(8).reshape(2,2,2)

# 配列を表示
print("Our Array...\n",arr)

# 次元数を確認
print("\nDimensions of our Array...\n",arr.ndim)

# データ型を確認
print("\nDatatype of our Array object...\n",arr.dtype)

# 形状を確認
print("\nShape of our Array object...\n",arr.shape)

# LA.norm() メソッドで軸を指定してノルムを計算
print("\nResult...\n",LA.norm(arr, axis = (1, 2)))

実行結果

Our Array...
    [[[0 1]
   [2 3]]

   [[4 5]
   [6 7]]]

Dimensions of our Array...
3

Datatype of our Array object...
int64

Shape of our Array object...
(2, 2, 2)

Result...
 [ 3.74165739 11.22497216]

結果の解説

ord を指定しない場合、デフォルトではフロベニウスノルムが計算されます。つまり、各2×2行列に含まれる全要素の二乗和の平方根が求められます。

  • 1つ目の行列 [[0, 1], [2, 3]] の場合: √(0² + 1² + 2² + 3²) = √14 ≈ 3.74165739
  • 2つ目の行列 [[4, 5], [6, 7]] の場合: √(4² + 5² + 6² + 7²) = √126 ≈ 11.22497216

このように、axis にタプルを指定することで、3次元以上の配列から複数の行列をまとめて取り出し、それぞれのノルムを一括して計算できます。機械学習や数値解析において、行列の大きさを評価したい場面で非常に便利な機能です。

  1. PythonでNumPyのnp.gradient()を使い、軸1に沿ったN次元配列の勾配を計算する方法

    NumPyのnp.gradient()関数は、配列の数値微分(勾配)を計算するための便利なツールです。内部の点では2次精度の中心差分が用いられ、境界部分では1次または2次精度の片側差分(前方差分または後方差分)が適用されます。そのため、返される勾配は入力配列と同じ形状になります。np.gradient()の主な引数この関数には以下のような引数があります。第1引数(f):スカラー関数のサンプル値を格納したN次元配列を指定します。第2引数(varargs):fの各値の間隔(spacing)を指定します。デフォルトではすべての次元で単位間隔(1)が使用されます。第3引数(edge_order):{1

  2. Pythonで軸0に沿ったN次元配列の勾配を返す方法

    勾配(グラディエント)は、内部の点では2次精度の中心差分を用いて計算され、境界では1次または2次精度の片側差分(前進差分または後退差分)を用いて計算されます。そのため、返される勾配は入力配列と同じ形状になります。np.gradient() 関数の主なパラメータは以下の通りです。第1パラメータ f: スカラー関数のサンプル値を格納したN次元配列。第2パラメータ varargs: f の値間の間隔(スペーシング)。デフォルトではすべての次元で単位間隔となります。第3パラメータ edge_order {1, 2}: 境界における差分の精度次数を指定します。デフォルトは 1。第4パラメータ axis: