【SciPy】argrelmax、argrelminを使って極大値、極小値を取得する方法[Python]

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

SciPy

前回、Pythonのmatplotlibでhist関数を使って複数のヒストグラムを同時に表示する方法とコツを紹介しました。

今回はSciPyのargrelmax、argrelminを使った極大値、極小値の取得方法を紹介します。

ちなみにSciPyのfind_peaksを使った極大値、極小値の取得方法はこちらの記事で紹介していますので、よかったらどうぞ。

まず極大値、極小値を取得するグラフをこんな感じに作成してみました。

import numpy as np
import matplotlib.pyplot as plt
import random

x = range(100)

random.seed(100)
y = [np.sin(np.radians(x_val)*10) + random.uniform(-0.5, 0.5) for x_val in x]

fig = plt.figure()
plt.clf()

plt.plot(x, y)

plt.show()

実行結果

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

argrelmax、argrelminを使った極大値、極小値の取得方法

argrelmax、argrelminを使うには「scipy.signal」の「argrelmax」と「argrelmin」をインポートします。

そしてグラフのYの値を通常のリストではなく、NumPyのアレイとしてそれぞれの関数に渡します。

その際、Xの値は必要ありません。

そして極大値、極小値となる要素のインデックスが返ってきます。

最終的にはそのインデックスとXの値のリスト、Yの値のリストに用いることで、極大値、極小値となるXの値とYの値が取得できます。

まずは極大値を取得してみます。

import numpy as np
import matplotlib.pyplot as plt
import random
from scipy.signal import argrelmax

x = range(100)

random.seed(100)
y = [np.sin(np.radians(x_val)*10) + random.uniform(-0.5, 0.5) for x_val in x]

relmax = argrelmax(np.array(y))

x_relmax = [x[ind] for ind in relmax[0]]
y_relmax = [y[ind] for ind in relmax[0]]

fig = plt.figure()
plt.clf()

plt.plot(x, y)
plt.scatter(x_relmax, y_relmax, color="Red")

plt.show()

実行結果

次に極小値を取得してみます。

import numpy as np
import matplotlib.pyplot as plt
import random
from scipy.signal import argrelmin

x = range(100)

random.seed(100)
y = [np.sin(np.radians(x_val)*10) + random.uniform(-0.5, 0.5) for x_val in x]

relmin = argrelmin(np.array(y))

x_relmin = [x[ind] for ind in relmin[0]]
y_relmin = [y[ind] for ind in relmin[0]]

fig = plt.figure()
plt.clf()

plt.plot(x, y)
plt.scatter(x_relmin, y_relmin, color="Red")

plt.show()

実行結果

ちなみにargrelmax、argrelminに通常のリストを渡すとエラーとなります。

import numpy as np
import matplotlib.pyplot as plt
import random
from scipy.signal import argrelmax

x = range(100)

random.seed(100)
y = [np.sin(np.radians(x_val)*10) + random.uniform(-0.5, 0.5) for x_val in x]

relmax = argrelmax(y)

x_relmax = [x[ind] for ind in relmax[0]]
y_relmax = [y[ind] for ind in relmax[0]]

fig = plt.figure()
plt.clf()

plt.plot(x, y)
plt.scatter(x_relmax, y_relmax, color="Red")

plt.show()

実行結果
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
Cell In[1], line 11
      8 random.seed(100)
      9 y = [np.sin(np.radians(x_val)*10) + random.uniform(-0.5, 0.5) for x_val in x]
---> 11 relmax = argrelmax(y)
     13 x_relmax = [x[ind] for ind in relmax[0]]
     14 y_relmax = [y[ind] for ind in relmax[0]]

(中略)

AttributeError: 'list' object has no attribute 'shape'

次回はNumPyのndarrayではインデックスをまとめたリストで直接要素を取得可能であることを紹介します。

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

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

コメント

コメントする

目次