【NumPy】リスト内の隣り合う要素の差分を計算する方法(np.diff)[Python]

  • URLをコピーしました!
目次

NumPy

前回、PythonのNumPyで日時を扱うnp.datetime64の使い方、特にnp.arangeを使って連続した日時をもつリストの作成方法を紹介しました。

今回はNumPyでリスト内の隣り合う要素の差分を計算する方法(diff関数)を紹介します。

それでは始めていきましょう。

np.diff

リスト内の隣り合う要素の差分を計算するには「np.diff(リスト)」とします。

import numpy as np

a = [1, 2, 3, 5, 7, 11, 13]

print(np.diff(a))

実行結果
[1 1 2 2 4 2]

結果の最初の数は元のリストの1つ目の要素と2つ目の要素の差分、結果の2つ目の数は元のリストの2つ目の要素と3つ目の要素の差分となります。

2次元リストでも差分を計算することができます。

import numpy as np

b = [[1, 2, 3, 4, 5],
     [3, 4, 5, 6, 7],
     [6, 7, 8, 9, 10]]

print(np.diff(b))

実行結果
[[1 1 1 1]
 [1 1 1 1]
 [1 1 1 1]]

また2次元以上のリストになると差分を計算する軸を指定することができます。

import numpy as np

b = [[1, 2, 3, 4, 5],
     [3, 4, 5, 6, 7],
     [6, 7, 8, 9, 10]]

print(np.diff(b, axis=0))

実行結果
[[2 2 2 2 2]
 [3 3 3 3 3]]
import numpy as np

b = [[1, 2, 3, 4, 5],
     [3, 4, 5, 6, 7],
     [6, 7, 8, 9, 10]]

print(np.diff(b, axis=1))

実行結果
[[1 1 1 1]
 [1 1 1 1]
 [1 1 1 1]]

もちろん3次元でも差分を計算できますが、軸が複雑になるので、どの軸に対して差分を計算しているのか注意が必要です。

import numpy as np

c = [[[1, 2, 3], [2, 3, 4], [3, 4, 5]],
     [[3, 4, 5], [5, 6, 7], [7, 8, 9]],
     [[6, 7, 8], [9, 10, 11], [12, 13, 14]]]

print(np.diff(c, axis=0))

実行結果
[[[2 2 2]
  [3 3 3]
  [4 4 4]]

 [[3 3 3]
  [4 4 4]
  [5 5 5]]]
import numpy as np

c = [[[1, 2, 3], [2, 3, 4], [3, 4, 5]],
     [[3, 4, 5], [5, 6, 7], [7, 8, 9]],
     [[6, 7, 8], [9, 10, 11], [12, 13, 14]]]

print(np.diff(c, axis=1))

実行結果
[[[1 1 1]
  [1 1 1]]

 [[2 2 2]
  [2 2 2]]

 [[3 3 3]
  [3 3 3]]]
import numpy as np

c = [[[1, 2, 3], [2, 3, 4], [3, 4, 5]],
     [[3, 4, 5], [5, 6, 7], [7, 8, 9]],
     [[6, 7, 8], [9, 10, 11], [12, 13, 14]]]

print(np.diff(c, axis=2))

実行結果
[[[1 1]
  [1 1]
  [1 1]]

 [[1 1]
  [1 1]
  [1 1]]

 [[1 1]
  [1 1]
  [1 1]]]

n回差分を計算する方法

diff関数では「np.diff(リスト, n)」とすることでn回差分を計算することができます。

import numpy as np

d = [1, 3, 6, 10, 15] 

print(np.diff(d, 1))
print(np.diff(d, 2))
print(np.diff(d, 3))

実行結果
[2 3 4 5]
[1 1 1]
[0 0]

リストの最初、もしくは最後に値を追加して差分を計算

「np.diff(リスト, prepend=値)」とすることでリストの最初に指定した値を追加してから差分を計算します。

import numpy as np

d = [1, 3, 6, 10, 15] 

print(np.diff(d, prepend=0))

実行結果
[1 2 3 4 5]

「np.diff(リスト, append=値)」とすることでリストの最後に指定した値を追加してから差分を計算します。

import numpy as np

d = [1, 3, 6, 10, 15] 

print(np.diff(d, append=21))

実行結果
[2 3 4 5 6]

prependもappendもリストを指定することができ、そのリストの要素が最初、もしくは最後に追加された後、差分が計算されます。

import numpy as np

d = [1, 3, 6, 10, 15] 

print(np.diff(d, prepend=[3, 2, 1]))

実行結果
[-1 -1  0  2  3  4  5]
import numpy as np

d = [1, 3, 6, 10, 15] 

print(np.diff(d, append=[21, 20, 19]))

実行結果
[ 2  3  4  5  6 -1 -1]

指定できるリストは1次元のリストのみです。

import numpy as np

d = [1, 3, 6, 10, 15] 

print(np.diff(d, prepend=[[3, 2], [2, 1]]))

実行結果
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
Cell In[8], line 5
      1 import numpy as np
      3 d = [1, 3, 6, 10, 15] 
----> 5 print(np.diff(d, prepend=[[3, 2], [2, 1]]))

File /Library/Frameworks/Python.framework/Versions/3.10/lib/
python3.10/site-packages/numpy/lib/function_base.py:1441, 
in diff(a, n, axis, prepend, append)
   1438     combined.append(append)
   1440 if len(combined) > 1:
-> 1441     a = np.concatenate(combined, axis)
   1443 slice1 = [slice(None)] * nd
   1444 slice2 = [slice(None)] * nd

ValueError: all the input arrays must have same number of 
dimensions, but the array at index 0 has 2 dimension(s) and 
the array at index 1 has 1 dimension(s)
import numpy as np

d = [1, 3, 6, 10, 15] 

print(np.diff(d, append=[[21, 20], [20, 19]]))

実行結果
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
Cell In[9], line 5
      1 import numpy as np
      3 d = [1, 3, 6, 10, 15] 
----> 5 print(np.diff(d, append=[[21, 20], [20, 19]]))

File /Library/Frameworks/Python.framework/Versions/3.10/lib/
python3.10/site-packages/numpy/lib/function_base.py:1441, 
in diff(a, n, axis, prepend, append)
   1438     combined.append(append)
   1440 if len(combined) > 1:
-> 1441     a = np.concatenate(combined, axis)
   1443 slice1 = [slice(None)] * nd
   1444 slice2 = [slice(None)] * nd

ValueError: all the input arrays must have same number of 
dimensions, but the array at index 0 has 1 dimension(s) and 
the array at index 1 has 2 dimension(s)

日時の差分を計算する方法

要素がNumPyのdatetime64型のリストの場合、日時の差分を計算することができます。

import numpy as np

e = np.arange("2024-01-01", "2024-01-06", dtype=np.datetime64)

print(e)

print(np.diff(e))

実行結果
['2024-01-01' '2024-01-02' '2024-01-03' '2024-01-04' '2024-01-05']
[1 1 1 1]

ちなみにnp.arangeを使って日時のリストを作成する方法はこちらの記事で紹介していますので、よかったらどうぞ。

次回はNumPyでリスト中のゼロではない要素の数を数える方法(np.count_nonzero)を紹介します。

ではでは今回はこんな感じで。

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

コメント

コメントする

目次