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 中查找具有相同第一列的所有行的最小值、最大值、平均值