gpt4 book ai didi

python - 检测数字列表中的峰值并记录它们的位置

转载 作者:行者123 更新时间:2023-11-28 18:05:13 25 4
gpt4 key购买 nike

我正在尝试创建一些代码来返回数值数组“峰值”(或局部最大值)的位置和值。

例如,列表 arr = [0, 1, 2, 5, 1, 0] 在位置 3 处有一个峰值,值为 5(因为 arr[3] 等于 5)。

数组的第一个和最后一个元素不会被视为峰值(在数学函数的上下文中,您不知道之前和之后是什么,因此您不知道它是峰值还是不是)。

def pick_peaks(arr):
print(arr)
posPeaks = {
"pos": [],
"peaks": [],
}
startFound = False
n = 0
while startFound == False:
if arr[n] == arr[n+1]:
n += 1
else:
startFound = True

endFound = False
m = len(arr) - 1
while endFound == False:
if arr[m] == arr[m-1]:
m -= 1
else:
endFound = True

for i in range(n+1, m):
if arr[i] == arr[i-1]:
None
elif arr[i] >= arr[i-1] and arr[i] >= arr[i+1]:
posPeaks["pos"].append(i)
posPeaks["peaks"].append(arr[i])

return posPeaks

我的问题是高原。 [1, 2, 2, 2, 1] 有一个峰值,而 [1, 2, 2, 2, 3] 没有。当平台为峰时,记录平台的第一个位置。

感谢任何帮助。

最佳答案

我建议你使用 groupby对连续的相等值进行分组,然后为每个组存储第一个位置,例如 [1, 2, 2, 2, 1] 它在元组列表之后创建以下列表 [(1 , 0), (2, 1), (1, 4)], 放在一起:

from itertools import groupby


def peaks(data):
start = 0
sequence = []
for key, group in groupby(data):
sequence.append((key, start))
start += sum(1 for _ in group)

for (b, bi), (m, mi), (a, ai) in zip(sequence, sequence[1:], sequence[2:]):
if b < m and a < m:
yield m, mi


print(list(peaks([0, 1, 2, 5, 1, 0])))
print(list(peaks([1, 2, 2, 2, 1])))
print(list(peaks([1, 2, 2, 2, 3])))

输出

[(5, 3)]
[(2, 1)]
[]

关于python - 检测数字列表中的峰值并记录它们的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53914486/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com