隣り合う要素の差分をとる関数
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_01
# 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
# 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]
コメントを書く