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

PythonでNaNを1として扱い、指定した軸に沿った配列要素の累積積を返す方法

NumPyのnancumprod()メソッドを使うと、NaNを1として扱いながら、指定した軸に沿った配列要素の累積積を求めることができます。NaNに遭遇しても累積積の値は変化せず、先頭にあるNaNは1に置き換えられます。また、すべてがNaNのスライスや空のスライスに対しては1が返されます。out引数を指定しない限り、結果を格納した新しい配列が返されます。

累積積とは、例えば「5、5×10、5×10×15、5×10×15×20」のように、要素を順番に掛け合わせていく計算のことです。

nancumprod()メソッドの主なパラメータ

  • 第1パラメータ: 入力配列を指定します。
  • 第2パラメータ(axis): 累積積を計算する軸を指定します。デフォルトでは入力配列はフラット化されて処理されます。
  • 第3パラメータ(dtype): 返される配列の型、および要素を掛け合わせる際のアキュムレータの型を指定します。dtypeを省略した場合は入力配列aのdtypeが使われます。ただし、aがデフォルトのプラットフォーム整数よりも精度の低い整数dtypeを持つ場合は、代わりにデフォルトのプラットフォーム整数が使用されます。
  • 第4パラメータ(out): 結果を格納する代替の出力配列です。期待される出力と同じ形状・バッファ長を持つ必要がありますが、必要に応じて結果の値の型はキャストされます。

手順

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

import numpy as np

array()メソッドを使ってnumpy配列を作成します。ここではint型の要素に加えてnanも含めています。

arr = np.array([[5, 10, 15], [20, np.nan, 30]])

配列を表示します。

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

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

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

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

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

NaNを1として扱いながら、指定した軸(ここではaxis=1)に沿った配列要素の累積積を返すには、nancumprod()メソッドを使用します。

print("\nCumulative Product of array elements...\n",np.nancumprod(arr, axis = 1))

サンプルコード

import numpy as np

# array()メソッドを使ってnumpy配列を作成
# int型の要素に加えてnanを含めています
arr = np.array([[5, 10, 15], [20, np.nan, 30]])

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

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

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

# NaNを1として扱い、axis=1に沿って累積積を計算
# NaNに遭遇しても累積積は変化せず、先頭のNaNは1に置き換えられます
print("\nCumulative Product of array elements...\n",np.nancumprod(arr, axis = 1))

実行結果

Our Array...
[[ 5. 10. 15.]
[20. nan 30.]]

Dimensions of our Array...
2

Datatype of our Array object...
float64

Cumulative Product of array elements...
[[ 5. 50. 750.]
[ 20. 20. 600.]]

実行結果から、axis=1(各行方向)に沿って累積積が計算されていることがわかります。2行目のNaNの位置では値が変化せず直前の値(20)がそのまま引き継がれ、その後30が掛けられて600になっています。このように、nancumprod()を使えばNaNを気にすることなく安全に累積積を計算できます。

  1. PythonでNaNを0として扱い、軸0に沿った配列要素の累積和を返す方法

    NaN(非数)をゼロとして扱いながら、指定した軸に沿って配列要素の累積和を返すには、NumPyのnancumsum()メソッドを使用します。このメソッドの特徴は以下の通りです。累積和の計算中にNaNが現れても、それ以降の累積和の値は変化しません先頭に現れたNaNはゼロに置き換えられますすべてがNaNであるスライスや空のスライスに対しては、ゼロが返されます累積和とは、「5」「5+10」「5+10+15」「5+10+15+20」のように、それまでの要素を順番に足し合わせていく計算のことです。nancumsum()メソッドのパラメータ第1パラメータ(入力配列): 累積和を計算する対象となる配列です。

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

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