scipyでピーク検出
タイトルの通りですが、新しい関数とその使い方について書きます。
やることはscipyでのピーク検出です。単純にピークと呼んでいますが、離散的なデータから極大極小を見つける関数のようです。
関数は以下のようにインポートします。
from scipy.signal import argrelmax x = np.array([2, 1, 2, 3, 2, 0, 1, 0]) print(argrelmax(x)) >>> (array([3, 6]), )
基本的に必要な引数はデータだけなので、適当なnp.arrayを与えてやると、ピーク位置のインデックスを返してきます。
という使い方は以下にかいてありました。
参考:
org-technology.com
ここからは使ってみての考察なのですが、scipyのドキュメントを読むと、任意のパラメーターが幾つかあります。
scipy.signal.argrelmax — SciPy v0.17.0 Reference Guide
このうちorderのところを指定してやると、どの幅でピークを見つけるかということを指定できるのだと思います。
このようなグラフ(先日取ったラマン分光のデータです)があったとき、デフォルト設定だとピークは
以上のように検出されます。大量ですね。
しかし、求めているピーク自体は1460あたりのシャープなピークです。
これはorderがデフォルト設定(order = 1)だと、x軸の狭い幅の増減を検出してしまうためいろんなピークを検出しているのだと思います。
つまり
np.array([0, 1, 2, 1, 5, 1, 3, 2, 1])
という配列の場合order = 1 だとindex = 2, 4, 6が検出されますが、order = 3とするとindex = 4のみが検出されます。
先のグラフの例でいうと、order = 100とすると以下のようなグラフになりました。
これで一応やりたいことがpythonでできるようになりました。