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

Python/NumPyのnancumprod()でNaNを1として扱う累積積を返し、結果の型を変更する方法

nancumprod()メソッドの概要

指定した軸に沿って配列要素の累積積を求める際に、NaN(非数)を1として扱いたい場合は、NumPyのnancumprod()メソッドを使用します。NaNに到達しても累積積の値は変化せず、先頭にあるNaNは1に置き換えられます。すべてがNaNのスライスや空のスライスに対しては、1が返されます。

このメソッドは結果を格納した新しい配列を返します。ただし、引数outが指定されている場合は、その配列に結果が書き込まれた上で返されます。

累積積の動作イメージは「5 → 5×10 → 5×10×15 → 5×10×15×20」のように、要素を順番に掛け合わせていく処理です。

主なパラメータ

第1パラメータ(入力配列):累積積を計算する対象となる入力配列です。

第2パラメータ(axis):累積積を計算する軸を指定します。デフォルトでは入力配列がフラット化されてから計算されます。

第3パラメータ(dtype):返される配列の型、および要素を掛け合わせる際のアキュムレータの型を指定します。dtypeを省略した場合は入力配列の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)

nancumprod()メソッドを使って、NaNを1として扱いながら指定した軸に沿った累積積を求めます。ここではaxis=1(行方向)とdtype=intを指定しています。

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

コード例全体

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)

# nancumprod()メソッドで、NaNを1として扱いながら
# 指定した軸に沿った累積積を求めます
print("\nCumulative Product of array elements...\n",np.nancumprod(arr, axis = 1, dtype = int))

実行結果

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]]

出力の解説

入力配列にはnanが含まれるため、データ型はfloat64になっています。一方、nancumprod()にdtype=intを指定しているため、累積積の結果は整数型で返されています。

2行目の[20, nan, 30]に注目すると、累積積は[20, 20×1, 20×1×30]、つまり[20, 20, 600]となります。nanが1として扱われるため、累積積の値は途中で変化しません。これがnancumprod()と通常のcumprod()との大きな違いです。


  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 Pandasのset_closed()で現在のIntervalArrayと同一の、指定した側で閉じた配列を返す方法

    PythonのPandasライブラリでは、現在のIntervalArrayと同一でありながら、指定した側で閉じられた新しいIntervalArrayを返したい場合に、set_closed()メソッドを使用します。引数にbothを指定すると、区間の両端が閉じた(両端を含む)IntervalArrayが生成されます。 set_closed()メソッドとは set_closed()は、既存のIntervalArrayの各区間の開閉状態を変更したコピーを返すメソッドです。指定できる値は以下の4種類です。 left:左端のみ閉じる right:右端のみ閉じる both:両端を閉じる neither:両