2015-11-26 15 views
5

関数argrelextrema from scipy.signalはフラット極値を検出しません。 例:argrelextremaとフラット極値

import numpy as np 
from scipy.signal import argrelextrema 
data = np.array([ 0, 1, 2, 1, 0, 1, 3, 3, 1, 0 ]) 
argrelextrema(data, np.greater) 
(array([2]),) 

第MAX(2)は、第二MAX(3,3)が検出されていないことを検出しました。

この現象の回避策はありますか?おかげさまで

答えて

12

短い回答:おそらくargrelextremaはあなたの仕事に十分な柔軟性を持たないでしょう。あなたのニーズに合った独自の関数を書くことを検討してください。


長い答え:あなたはargrelextremaを使用するためにバインドされていますか?はいの場合、comparatororderの引数がargrelextremareferenceを参照)で遊ぶことができます。

np.greater_equalcomparatorと選択すれば十分でしょう。

>>> data = np.array([ 0, 1, 2, 1, 0, 1, 3, 3, 1, 0 ]) 
>>> print(argrelextrema(data, np.greater_equal,order=1)) 
(array([2, 6, 7]),) 

注しかし、この方法で

>>> data = np.array([ 0, 1, 2, 1, 0, 1, 3, 3, 4, 1, 0 ]) 
>>> print(argrelextrema(data, np.greater_equal,order=1)) 
(array([2, 6, 8]),) 

argrelextremaが今大きいかである最大値として、すべてを見ているので、あなたはおそらく、最初3値と最大値として4を見つけ、たいと異なった動作をすることをその2つの最も近い近隣に等しい。 order引数を使用して、この比較が保持する必要があるネイバー数を決定することができます。order=2を選択すると、上限が4になるように上の例が変更されます。

>>> print(argrelextrema(data, np.greater_equal,order=2)) 
(array([2, 8]),) 

この方法の欠点は、しかし、があります - さんは、一度に多くのデータを変更してみましょう:argrelextremaがあるとして最後の値は、4であなたのピークを見つけることからあなたを保つよう

>>> data = np.array([ 0, 1, 2, 1, 0, 1, 3, 3, 4, 1, 5 ]) 
>>> print(argrelextrema(data, np.greater_equal,order=2)) 
(array([ 2, 10]),) 

は別のピークを追加するには4より大きい2番目のネイバーが表示されます(ノイズの多いデータには有効ですが、必ずしもすべてのケースで期待される動作である必要はありません)。


argrelextremaを使用すると、固定数のネイバー間で常にバイナリ操作に制限されます。ただし、上記の例でargrelextremaはすべてndata[n] > data[n-1] and data[n] > data[n+1])を返すようにしています。たとえば、最初のネイバーが同じ値を持っている場合に2番目のネイバーをチェックするなど、簡単にこれを実装してルールを絞り込むことができます。完全を期すために


scipy.signalfind_peaks_cwtでより複雑な機能があるように思われます。私はそれを使用する経験はありませんので、あなたにそれについての詳細を与えることはできません。

+0

その他のピーク検出アルゴリズムについては、https:// githubをチェックすることもできます。com/MonsieurV/py-findpeaks argrelextrema'は、アルゴリズムの振る舞いを変えたいときには、本当に簡単な選択ではありません。 –

関連する問題