来自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)。
此行为的任何解决方法? 感谢。
答案 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
似乎有更复杂的功能。然而,我没有使用它的经验,因此无法向您提供有关它的更多细节。