1. ホーム
  2. python

[解決済み] アーグレレックストレマとフラットエキストレマ

2022-02-15 08:23:51

質問

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]),)

最初の最大値(2)は検出され、2番目の最大値(3, 3)は検出されません。

この挙動に対する回避策はありますか? ありがとうございます。

解決方法を教えてください。

簡単にお答えします。 おそらく argrelextrema は、あなたのタスクに対して十分に柔軟ではありません。あなたのニーズに合った独自の関数を書くことを検討してください。


長い回答です。 を使用しなければならないのでしょうか? argrelextrema ? もしそうであれば、その場合は comparatororder の引数は argrelextrema (を参照してください)。 参照 ).

簡単な例では、以下のようにすればよいでしょう。 np.greater_equal として comparator .

>>> 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]),)

の挙動は、おそらくあなたが望むものとは異なっており、最初の 34 を最大値とすると argrelextrema は、すべてのものが、その2つの最近傍のものよりも大きいか等しい最大値であるとみなすようになりました。これで order 引数で、この比較が成立する隣人をいくつにするか決定します。 order=2 を見つけるだけで、上の例のように 4 を最大値とする。

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

しかし、これには欠点があります。もう一度、データを変えてみましょう。

>>> 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 というように argrelextrema よりも大きい2番目の近傍が見えています。 4 (ノイズの多いデータには有効ですが、必ずしもすべてのケースで期待される動作ではありません)。


使用方法 argrelextrema の場合、常に固定数の隣接間での二項演算に制限されます。しかし、すべての argrelextrema は、上記の例でやっていることは n もし data[n] > data[n-1] and data[n] > data[n+1] . これを自分で実装して、例えば、1つ目の近傍が同じ値である場合に2つ目の近傍をチェックするなど、ルールを洗練させることも簡単にできます。


念のため、もっと凝った関数が scipy.signal , find_peaks_cwt . しかし、私は使用経験がないため、これ以上の詳細についてはお答えすることができません。