『Python数値計算ノート』ではアフィリエイトプログラムを利用して商品を紹介しています。

numpy.diff(), numpy.ediff1d()

隣り合う要素の差分をとる関数

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]

 

コメント