Python在离散数据上查找局部最大值和最小值[重复]

Posted

技术标签:

【中文标题】Python在离散数据上查找局部最大值和最小值[重复]【英文标题】:Python Finding local maxima and minima on discrete data [duplicate] 【发布时间】:2021-11-06 13:24:04 【问题描述】:

假设这条线由 pandas 中的离散随机数组成。如何找到 A、B、C、D 点?

A是第一个点和C之间的最高点

C是A和B之间的最低点

B是C和D之间的最高点

另一个例子可能是这样的

您可以使用这些数据来测试: [1, 2, 3, 10, 13, 15, 20, 50, 49, 49, 32, 33, 35, 36, 35, 34, 33, 34, 35, 36, 30, 27, 22, 15, 15 , 17, 20, 27, 30, 32, 50, 56, 67, 85, 100, 99, 94, 83, 72, 59, 66, 67, 89, 90, 92, 127, 130, 189]

以上数据:

A = 50

B = 100

C = 15

D = 59

【问题讨论】:

【参考方案1】:

如果您确定这条线是连续的(不一定是平滑的),您可以通过使用有限差分来使用离散梯度搜索。

如果您从 A 的左侧开始,您可以计算 (y[i+1]-y[i])(我省略了除以 h,因为它与此目的无关。)只需检查是否为正。如果是,请继续前进并再次计算。其实直接写会更方便。

def find_a():
    i=toTheLeftOfA
    done=false
    while not done:
        if y[i-1]-y[i]>0:
            i=i+1
        else:
            done=true
    return([i,y[i]])
## retrieve [X,Y(X)=A] as find_a()

我相信还有更聪明的东西,比如二分搜索。但只要你只需要做一次而不是每小时一百万次,这应该可以工作。

【讨论】:

不是连续的,不过谢谢 当然对。我的意思是没有曲线存储为向量是“连续的”。但是,如果它对于长时间的延伸是单调的,并且这些延伸被您的兴趣点划分,那么这本质上就是图书馆在逻辑上所说的。如果曲线对于长时间的拉伸不是单调的,那么您描述的点可能很丰富并且不是很有趣。

以上是关于Python在离散数据上查找局部最大值和最小值[重复]的主要内容,如果未能解决你的问题,请参考以下文章

Python/Pandas- 在趋势变化时应用标签(识别数据集中的局部最大值和最小值)

在 1D-NumPy 数组中查找奇异值/局部最大值/最小值集(再次)

查找函数的所有局部最大值

在 Pandas、Python 中查找具有相同第一列的所有行的最小值、最大值、平均值

用于在多张纸上循环的范围内查找最大值和最小值的 VBA 代码

利用Python迭代器查找最小值和最大值