1. ホーム
  2. パイソン

python 不連続系列の極値点を求める

2022-02-24 03:39:39
<パス

scipy.signalのargrelextrema関数を使用する( API 簡単で便利です。

import numpy as np 
import pylab as pl
import matplotlib.pyplot as plt
import scipy.signal as signal
x=np.array([
    0, 6, 25, 20, 15, 8, 15, 6, 0, 6, 0, -5, -15, -3, 4, 10, 8, 13, 8, 10, 3,
    1, 20, 7, 3, 0 ])
plt.figure(figuresize=(16,4))
plt.plot(np.range(len(x)),x)
print x[signal.argrelextrema(x, np.greater)]
print signal.argrelextrema(x, np.greater)

plt.plot(signal.argrelextrema(x, np.greater)[0],x[signal.argrelextrema(x, np.greater)],'o')
plt.plot(signal.argrelextrema(-x, np.greater)[0],x[signal.argrelextrema(-x, np.greater)],'+')
# plt.plot(peakutils.index(-x),x[peakutils.index(-x)],'*')
plt.show()

[25 15 6 10 13 10 20]
(array([ 2, 6, 9, 15, 17, 19, 22]),)

x=np.array([
    0, 15, 15, 15, 15, 15, 8, 15, 6, 0, 6, 0, -5, -15, -3, 4, 10, 8, 13, 8, 10, 3,
    1, 20, 7, 3, 0 ])
plt.figure(figuresize=(16,4))
plt.plot(np.range(len(x)),x)
print x[signal.argrelextrema(x, np.greater)]
print signal.argrelextrema(x, np.greater)

plt.plot(signal.argrelextrema(x, np.greater)[0],x[signal.argrelextrema(x, np.greater)],'o')
plt.plot(signal.argrelextrema(x, np.less)[0],x[signal.argrelextrema(x, np.less)],'+')
plt.show()

[15 6 10 13 10 20]
(array([ 6, 9, 15, 17, 19, 22]),)


[25 15 6 10 13 10 20]
(array([ 2, 6, 9, 15, 17, 19, 22]),)


<イグ
ただし、左右のポールが同じポイントの場合は認識できないという問題がありますが、個人的には実際の使用ではほとんど発生しないと思いますので、無視していただいて結構です。

x=np.array([
    0, 15, 15, 15, 15, 15, 8, 15, 6, 0, 6, 0, -5, -15, -3, 4, 10, 8, 13, 8, 10, 3,
    1, 20, 7, 3, 0 ])
plt.figure(figuresize=(16,4))
plt.plot(np.range(len(x)),x)
print x[signal.argrelextrema(x, np.greater)]
print signal.argrelextrema(x, np.greater)

plt.plot(signal.argrelextrema(x, np.greater)[0],x[signal.argrelextrema(x, np.greater)],'o')
plt.plot(signal.argrelextrema(x, np.less)[0],x[signal.argrelextrema(x, np.less)],'+')
plt.show()


[15 6 10 13 10 20]
(array([ 6, 9, 15, 17, 19, 22]),)


<イグ
参考

  1. https://github.com/MonsieurV/py-findpeaks#scipysignalargrelextrema
  2. https://blog.ytotech.com/2015/11/01/findpeaks-in-python/
  3. https://plot.ly/python/peak-finding/
  4. https://www.scivision.co/python-findpeaks/