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

Pythonで指定された軸に沿ったN次元配列の勾配を求める方法(np.gradient)

NumPyのnp.gradient関数を使うと、N次元配列の数値勾配を簡単に計算できます。勾配は、配列の内部点では2次精度の中心差分を用いて計算され、境界部分では1次または2次精度の片側差分(前進差分または後退差分)が使用されます。そのため、返される勾配は入力配列と同じ形状になります。

np.gradient関数の主な引数

第1引数の f は、スカラー関数のサンプル値を格納したN次元配列です。

第2引数は varargs(可変長引数)で、f の値同士の間隔(スペーシング)を指定します。省略した場合、すべての次元で単位間隔(1)が使用されます。

第3引数の edge_order(1 または 2)は、境界における差分の精度次数を指定します。デフォルト値は 1 です。

第4引数の axis を指定すると、その軸に沿ってのみ勾配が計算されます。デフォルト(axis=None)では、入力配列のすべての軸に対して勾配が計算されます。axis には負の値も指定でき、その場合は最後の軸から逆順に数えられます。

このメソッドは、f の各次元に関する微分に対応するndarrayのリストを返します。それぞれの微分結果は f と同じ形状を持ちます。

実装手順

まず、必要なライブラリをインポートします。

import numpy as np

次に、array() メソッドを使ってnumpy配列を作成します。ここではfloat型の要素を持つ配列を作成します。

arr = np.array([[20, 35, 57], [70, 85, 120]], dtype = float)

作成した配列を表示します。

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

配列の次元数を確認します。

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

配列のデータ型を取得します。

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

勾配は、内部点では2次精度の中心差分、境界では1次または2次精度の片側差分によって計算され、返される勾配は入力配列と同じ形状になります。ここでは axis=0(行方向)に沿って勾配を計算します。

print("\nResult (gradient)...\n",np.gradient(arr, axis = 0))

完全なコード例

import numpy as np

# array()メソッドでnumpy配列を作成
# float型の要素を指定
arr = np.array([[20, 35, 57], [70, 85, 120]], dtype = float)

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

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

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

# 内部点では2次精度の中心差分、境界では片側差分で勾配を計算
# 返される勾配は入力配列と同じ形状になる
print("\nResult (gradient)...\n",np.gradient(arr, axis = 0))

出力結果

Our Array...
[[ 20. 35. 57.]
[ 70. 85. 120.]]

Dimensions of our Array...
2

Datatype of our Array object...
float64

Result (gradient)...
[[50. 50. 63.]
[50. 50. 63.]]

このように、np.gradient 関数に axis 引数を指定するだけで、特定の軸に沿った勾配を効率的に求めることができます。画像処理や物理シミュレーションなど、数値微分が必要な場面で非常に便利な機能です。

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

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

  2. Pythonでaxis=0に沿ってn階の離散差分を計算する方法

    n階の離散差分を計算するには、numpy.diff()メソッドを使用します。指定した軸に沿って、1階の差分は out[i] = a[i+1] - a[i] として求められ、それより高次の差分はdiff()を再帰的に適用することで計算されます。diff()メソッドはn階の差分を返します。出力の形状は、差分を取る軸において元の配列より次元がnだけ小さくなることを除き、入力配列aと同じになります。出力のデータ型は、aの任意の2つの要素間の差分の型と同じであり、ほとんどの場合はa自体の型と一致します。ただし、注目すべき例外としてdatetime64型があり、この場合はtimedelta64型の出力配列