我试图创建一些代码来返回数值数组的“峰值”(或局部极大值)的位置和值。在
例如,列表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]
有峰值,而{
感谢任何帮助。在
我知道我可能会迟到一点,但我想分享一下我使用NumPy阵列的解决方案:
- 例1(see graph):
^{pr2}$在示例3中,我们有一个从索引6到索引8的平坦的上限。在这种情况下,索引将始终指示平台的最左侧位置。如果要指明中间位置或最右侧位置,只需更改代码的以下部分:
为此:
如果可以对数据进行预处理以删除重复的数字,并且只保留1个唯一的数字,那么也可以对平台使用相同的算法。因此,您可以将示例
[1, 2, 2, 2, 1]
转换为[1, 2, 1]
,并应用相同的算法。在编辑: 代码:
输出:
^{pr2}$我建议您使用groupby对连续相等的值进行分组,然后为每个组存储第一个位置,例如
[1, 2, 2, 2, 1]
它创建了以下列表,下面是元组列表[(1, 0), (2, 1), (1, 4)]
,将所有这些放在一起:输出
^{pr2}$相关问题 更多 >
编程相关推荐