python - argrelextrema 和扁平极值

标签 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]),)

检测到第一个最大值 (2),未检测到第二个最大值 (3, 3)。

此行为有任何解决方法吗? 谢谢。

最佳答案

简短回答:argrelextrema 可能不够灵活,无法完成您的任务。考虑编写自己的函数以满足您的需求。


更长的答案:你一定要使用argrelextrema吗?如果是,那么您可以使用 argrelextremacomparatororder 参数(参见 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]),)

行为与您可能希望的不同,找到第一个 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,您将始终被限制在固定数量的邻居之间进行二元运算。但是请注意,如果 data[n] > data[n-1] 和 data[ n] > 数据[n+1]。您可以自己轻松实现这一点,然后改进规则,例如检查第二个邻居以防第一个邻居具有相同的值。


为了完整起见,scipy.signal中似乎有一个更精细的函数,find_peaks_cwt .但是,我没有使用它的经验,因此无法为您提供更多详细信息。

关于python - argrelextrema 和扁平极值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33937445/

相关文章:

python - 循环填充一列

python - Python string.find 使用什么?

python - Axes3d 与 axes3d matplotlib

python - Scipy.misc 导入不起作用

Python - 从文件中剥离最后一个字节的最简单方法?

python - Python 中的交互式绘图?

python - 如何使用 Pandas Timestamp 折叠参数?

python - skcuda linalg 中的 "unsupported combination of input order"

python - 没有 SciPy 的 NumPy 数组的 3D 插值

python - Scipy 的 fftpack dct 和 idct