隣り合う要素の差分をとる関数
numpy.diff() や numpy.ediff1d() は受け取った配列のとなり合う要素の差分を作って返します。
numpy.diff()
numpy.diff() は受け取った配列の隣り合う要素同士の 差分 を計算します。
numpy.diff(a, n=1, axis=-1, prepend=<no value>, append=<no value>)
a が一次元配列で要素数 (a.size) が n ならば、戻り値は要素数 n-1 の一次元配列です。
たとえば、[1 3 7 15] という配列が与えられたとき、1 と 3, 3 と 7, 7 と 15 の差分を要素にもつ配列 [2 4 8] が返ります。
# NUMPY_DIFF # In[1] import numpy as np # 一次元配列を作成 arr = np.array([1, 3, 7, 15]) # 隣り合う要素同士の差分を計算 diff = np.diff(arr) print(diff) # [2 4 8]
axis を指定せずに多次元配列を渡すと、次元ごとに差分配列をつくります。
# In[2] # 二次元配列を作成 arr = np.array([[0, 4, 3, 7], [1, 8, 2, 9]]) # 次元ごとに隣り合う要素同士の差分を計算 diff = np.diff(arr) print(diff) # [[ 4 -1 4] # [ 7 -6 7]]
axis=0 を指定して多次元配列を渡すと、行方向の差分配列を生成します。
# In[3] # 行方向に並ぶ要素同士の差分を計算 arr_diff = np.diff(arr, axis=0) print(arr_diff) # [[ 1 4 -1 2]]
axis=1 を指定して多次元配列を渡すと、列方向の差分配列を生成します。
# In[4] # 列方向に並ぶ要素同士の差分を計算 diff = np.diff(arr, axis=1) print(diff) # [[ 4 -1 4] # [ 7 -6 7]]
n は差分をとる回数を指定する引数です。
たとえば n=2 を指定することは、numpy.diff() を 2 回適用するのと同じです。
# In[5] # 一次元配列を作成 arr = np.array([0, 3, 9, 1, 5, 7, 2]) # 隣り合う要素同士の差分を計算 diff_1 = np.diff(arr, n=1) diff_2 = np.diff(arr, n=2) diff_3 = np.diff(arr, n=3) print("n=1 : {}".format(diff_1)) print("n=2 : {}".format(diff_2)) print("n=3 : {}".format(diff_3)) # n=1 : [ 3 6 -8 4 2 -5] # n=2 : [ 3 -14 12 -2 -7] # n=3 : [-17 26 -14 -5]
prepend を指定すると、配列の先頭に要素を追加してから差分をとります。append を指定すると、配列の末尾に要素を追加してから差分配列をつくります。
# In[6] # 一次元配列を作成 arr = np.array([2, 7, 5, 1, 9]) diff_1 = np.diff(arr, prepend=1) diff_2 = np.diff(arr, append=5) print(diff_1) print(diff_2) # [ 1 5 -2 -4 8] # [ 5 -2 -4 8 -4]
numpy.ediff1d()
numpy.ediff1d() は配列を受け取って、隣り合う要素の差分をとった一次元配列を返します。
numpy.ediff1d(ary, to_end=None, to_begin=None)
# NUMPY_EDIFF1D # In[1] # 階差数列 arr = np.array([1, 2, 4, 7, 11, 16]) # 隣り合う要素の差分をとる x = np.ediff1d(arr) print(x) # [1 2 3 4 5]
to_end で末尾に追加する要素、to_begin で先頭に追加する要素を指定できます。
# In[2] # 隣り合う要素の差分をとって、 # 末尾と先頭に要素を追加する y = np.ediff1d(arr, to_end=[40, 50], to_begin=[10, 20, 30]) print(y) # [10 20 30 1 2 3 4 5 40 50]
第1引数に多次元配列を渡すと、フラットにしてから差分をとって一次元配列を返します。
# In[3] arr = np.array([[0, 5, 9], [2, 7, 2]]) # フラットにして隣り合う要素の差分をとる z = np.ediff1d(arr) print(z) # [ 5 4 -7 5 -5]
【おすすめ記事】≫ numpy.whereで要素を置き換える
コメント