Subscribed unsubscribe Subscribe Subscribe

scipyでピーク検出

Python

タイトルの通りですが、新しい関数とその使い方について書きます。

やることは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のところを指定してやると、どの幅でピークを見つけるかということを指定できるのだと思います。
f:id:jinpei0908:20161126223220p:plain
このようなグラフ(先日取ったラマン分光のデータです)があったとき、デフォルト設定だとピークは
f:id:jinpei0908:20161126223139p:plain
以上のように検出されます。大量ですね。
しかし、求めているピーク自体は1460{\sf{cm^{-1}}}あたりのシャープなピークです。
これは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とすると以下のようなグラフになりました。
f:id:jinpei0908:20161126224108p:plain
これで一応やりたいことがpythonでできるようになりました。