argrelextrema和flat extrema

时间:2015-11-26 11:26:10

标签: python scipy

来自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)。

此行为的任何解决方法? 感谢。

1 个答案:

答案 0 :(得分:14)

简答:可能argrelextrema对您的任务不够灵活。考虑编写符合您需求的自己的功能。

更长的回答:您是否必须使用argrelextrema?如果是,那么您可以使用comparator的{​​{1}}和order参数(请参阅reference)。

为简单起见,将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]),) 3视为最大值,因为4现在将所有内容视为大于或等于其最近的两个最大值邻居。您现在可以使用argrelextrema参数来决定此比较必须包含的邻居数量 - 选择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(这可能很有用)对于噪声数据,但不一定是所有情况下预期的行为。)

使用4,您将始终受限于固定数量的邻居之间的二进制操作。但请注意,上述示例中的所有argrelextrema所做的就是返回argrelextrema,如果是n。您可以自己轻松地实现这一点,然后细化规则,例如通过检查第二个邻居,以防第一个邻居具有相同的值。

为了完整起见,data[n] > data[n-1] and data[n] > data[n+1]find_peaks_cwt似乎有更复杂的功能。然而,我没有使用它的经验,因此无法向您提供有关它的更多细节。