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] が返ります。

# DIFF_01-1

import numpy as np

# 一次元配列を作成
arr = np.array([1, 3, 7, 15])

# 隣り合う要素同士の差分を計算
diff = np.diff(arr)

print(diff)
[2 4 8]

 axis を指定せずに多次元配列を渡すと、次元ごとに差分配列をつくります。

# DIFF_01-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 を指定して多次元配列を渡すと、行方向の差分配列を生成します。

# DIFF_01-3

# 行方向に並ぶ要素同士の差分を計算
arr_diff = np.diff(arr, axis=0)

print(arr_diff)
[[ 1  4 -1  2]]

 axis=1 を指定して多次元配列を渡すと、列方向の差分配列を生成します。

# DIFF_01-4

# 列方向に並ぶ要素同士の差分を計算
diff = np.diff(arr, axis=1)

print(diff)
[[ 4 -1  4]
 [ 7 -6  7]]

 n は差分をとる回数を指定する引数です。
 たとえば n=2 を指定することは、numpy.diff() を 2 回適用するのと同じです。

# DIFF_02

import numpy as np

# 一次元配列を作成
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 を指定すると、配列の末尾に要素を追加してから差分配列をつくります。

# DIFF_03

import numpy as np

# 一次元配列を作成
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)
# DIFF_04-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 で先頭に追加する要素を指定できます。

# DIFF_04-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 引数に多次元配列を渡すと、フラットにしてから差分をとって一次元配列を返します。

# DIFF_04-3

arr = np.array([[0, 5, 9],
                [2, 7, 2]])

# フラットにして隣り合う要素の差分をとる
z = np.ediff1d(arr)

print(z)
[ 5  4 -7  5 -5]