NumPyの差分を取得する関数とメソッドまとめ

NumPyでは、配列の合計・和を取得する方法として、以下の3つ関数が備えられています。

  • np.diff: 配列の任意の次元軸方向の要素の階差数列を取得(第n階差も指定可能)
  • np.ediff1d: 配列の全要素の階差数列を1次元配列で取得
  • np.subtract: 2つの配列の要素ごとの差分を取得

なお、NumPy配列の和を求める関数群と違って、これらには同名のメソッドは存在しません。また配列内の要素に欠損値nanがある場合の処理が異なる関数もありません。

それでは、それぞれ簡潔に解説していきます。

目次

1. diff: 次元軸ごとの階差数列を取得

np.diff()は、渡した配列の階差数列を取得する関数です。さっそく以下のコードをご覧ください。

In [1]:
import numpy as np
rng = np.random.default_rng()
a = rng.integers(0, 11, (5, ))
a
Out[1]:
array([1, 3, 1, 9, 6])
In [2]:
# 階差数列を取得
np.diff(a)
Out[2]:
array([ 2, -2,  8, -3])

オプション引数 n で第n階差を取得するのかを指定することが可能です。

In [3]:
# 第n階差を取得するかを指定
np.diff(a, n=2)
Out[3]:
array([ -4,  10, -11])

多次元配列の場合

多次元配列の場合も見てみましょう。以下の配列を使って確認して行きます。

In [1]:
import numpy as np
rng = np.random.default_rng()
a = rng.integers(0, 11, (3, 5))
a
Out[1]:
array([[2, 0, 5, 4, 4],
       [8, 8, 5, 3, 1],
       [8, 8, 8, 2, 4]])

デフォルトでは axis=-1 なので最後の軸、つまり1次元軸(横軸)方向に階差数列を取得します。

In [2]:
# デフォルトでは1次元軸(横軸)の階差数列を取得
np.diff(a)
Out[2]:
array([[-2,  5, -1,  0],
       [ 0, -3, -2, -2],
       [ 0,  0, -6,  2]])

2次元配列では axis=0 にすると2次元軸(縦軸)方向の階差数列を取得することができます。

In [3]:
# 2次元軸(縦軸)の階差数列を取得
np.diff(a, axis=0)
Out[3]:
array([[ 6,  8,  0, -1, -3],
       [ 0,  0,  3, -1,  3]])

なお、多次元配列のすべての要素を対象として階差数列を取得したい場合は、後述するnp.ediff1d()を使います。

np.diff()関数では、さらにオプション引数prepend や appendで配列の前方や後方に任意の数値を追加した上で、階差数列を取得することもできます。詳しくは以下のページで解説しているので、ぜひご確認ください。

2. np.ediff1d: 全要素の階差数列を取得

np.diff()は多次元配列を渡した場合、指定の次元軸の階差数列しか取得することはできませんが、np.ediff1d()では全要素から階差数列を取得することができます。ただし、np.diff()のように第n階差数列を取得することはできません。

早速、以下のコードをご確認ください。

In [1]:
import numpy as np
rng = np.random.default_rng()
a = rng.integers(0, 11, (2, 3))
a
Out[1]:
array([[0, 1, 5],
       [3, 7, 4]])
In [2]:
# 全要素を対象として階差数列を取得
np.ediff1d(a)
Out[2]:
array([ 1,  4, -2,  4, -3])

オプション引数のto_end やto_begin で階差数列の前後に任意の数値を追加することが可能です。

In [3]:
# 階差数列の前後に任意の値を追加
np.ediff1d(a, to_end=999, to_begin=100)
Out[3]:
array([100,   1,   4,  -2,   4,  -3, 999])

3. np.subtract: 配列同士の差分を取得

np.subtract()は、引数に渡した2つの配列の要素ごとの差分を取得する関数です。これは x1 – x2 という演算と同じです。処理速度もどちらもほとんど違いはありません。しかし、np.subtract()関数は様々な引数でパラメータを指定することができるため操作の自由度は単純な演算よりも高いです。

以下の2つの配列x1とx2を例に見ていきましょう。

In [1]:
import numpy as np
rng = np.random.default_rng()
x1 = rng.integers(0, 10, (2, 3))
x1
Out[1]:
array([[5, 6, 4],
       [1, 8, 6]])
In [2]:
x2 = rng.integers(0, 10, (2, 3))
x2
Out[2]:
array([[8, 3, 4],
       [6, 8, 4]])

この2つの配列を、np.subtract()に渡すと要素ごとに和を求めます。

In [3]:
# 2つの配列x1とx2の要素ごとの差分を求める
np.subtract(x1, x2)
Out[3]:
array([[-3,  3,  0],
       [-5,  0,  2]])

出力結果は -演算子で算術演算した場合とまったく同じです。

In [4]:
#単純な演算と同じ
x1 - x2 
Out[4]:
array([[-3,  3,  0],
       [-5,  0,  2]])

ただし、np.subtract()はオプション引数 out や where、キーワード引数 axis、dtype、keepdimsなどを設定することが可能です。目的に応じて使い分けると良いでしょう。より詳しくは以下のページで解説しています。

4. まとめ

以上がNumPy配列の差分を取得するために用意されている関数です。最後に一覧を掲載しておきます。

関数名 解説
np.diff 次元軸ごとの階差数列を取得
np.ediff1d 配列の全要素の階差数列を取得
np.subtract 配列同士の差分を取得



よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

目次
閉じる