函数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:
简短回答:可能
argrelextrema
对您的任务不够灵活。考虑编写符合您需要的函数。较长的答案:您是否一定要使用
argrelextrema
?如果是,那么可以使用comparator
的order
参数和argrelextrema
参数(请参见reference)。对于您的简单示例,选择
np.greater_equal
作为comparator
就足够了。但是请注意,以这种方式
行为与您可能希望的不同,将第一个
3
和4
作为最大值,因为argrelextrema
现在将所有内容视为大于或等于其两个最近邻居的最大值。现在您可以使用order
参数来决定这个比较必须保持多少个邻居-选择order=2
将改变我的上例,使其仅找到4
作为最大值。不过,这有一个缺点——让我们再次更改数据:
添加另一个峰值作为最后一个值会使您无法在
4
处找到峰值,因为argrelextrema
现在看到的第二个邻居大于4
(这对于噪声数据很有用,但不一定是所有情况下所期望的行为)。使用
argrelextrema
,您将始终限制在固定数量的邻居之间的二进制操作。但是,请注意,在上面的示例中,argrelextrema
所做的全部工作是返回n
,如果data[n] > data[n-1] and data[n] > data[n+1]
。您可以自己轻松地实现这一点,然后优化规则,例如,在第一个邻居具有相同值的情况下检查第二个邻居。为了完整起见,在} 中似乎有一个更详细的函数。但我没有使用它的经验,因此不能给你更多的细节。
scipy.signal
,^{相关问题 更多 >
编程相关推荐