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),未检测到第二个最大值 (3, 3)。
此行为有任何解决方法吗? 谢谢。
最佳答案
简短回答:argrelextrema
可能不够灵活,无法完成您的任务。考虑编写自己的函数以满足您的需求。
更长的答案:你一定要使用argrelextrema
吗?如果是,那么您可以使用 argrelextrema
的 comparator
和 order
参数(参见 reference)。
对于您的简单示例,选择np.greater_equal
作为比较器
就足够了。
>>> 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
,您将始终被限制在固定数量的邻居之间进行二元运算。但是请注意,如果 data[n] > data[n-1] 和 data[ n] > 数据[n+1]
。您可以自己轻松实现这一点,然后改进规则,例如检查第二个邻居以防第一个邻居具有相同的值。
为了完整起见,scipy.signal
中似乎有一个更精细的函数,find_peaks_cwt
.但是,我没有使用它的经验,因此无法为您提供更多详细信息。
关于python - argrelextrema 和扁平极值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33937445/