argrelextrema和平坦极值

2024-04-25 04:30:09 发布

您现在位置:Python中文网/ 问答频道 /正文

函数argrelextrema from scipy.signal未检测到平坦极值。 示例:

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

对这种行为有什么解决办法吗? 谢谢。


Tags: 函数fromimportnumpy示例datasignalas
1条回答
网友
1楼 · 发布于 2024-04-25 04:30:09

简短回答:可能argrelextrema对您的任务不够灵活。考虑编写符合您需要的函数。


较长的答案:您是否一定要使用argrelextrema?如果是,那么可以使用comparatororder参数和argrelextrema参数(请参见reference)。

对于您的简单示例,选择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现在将所有内容视为大于或等于其两个最近邻居的最大值。现在您可以使用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]。您可以自己轻松地实现这一点,然后优化规则,例如,在第一个邻居具有相同值的情况下检查第二个邻居。


为了完整起见,在scipy.signal^{}中似乎有一个更详细的函数。但我没有使用它的经验,因此不能给你更多的细节。

相关问题 更多 >