在数据边界处查找峰

时间:2019-07-02 16:34:49

标签: python numpy scipy

我想使用scipy.signal.find_peaks在某些2D数据中查找峰,但是该函数默认忽略所有边缘峰(峰出现在阵列的左边界或右边界)。有没有办法在结果中包括边缘峰?

例如,我想要以下代码:

find_peaks([5,4,3,3,2,3])

生产

[0,5]

但它产生

[]

2 个答案:

答案 0 :(得分:0)

根据find_peaks的更详细用法,我建议在数组的开头和结尾重复数据:例如

peak_info = find_peaks([4,5,4,3,3,2,3,2])
# correct for additional initial element in auxiliary input array
peaks = peak_info[0] - 1

例如,如果设置了width的最低要求峰find_peaks参数,则甚至有可能在开头和结尾重复反向数组。

find_peaks通常仅在左侧都具有较低数据值的情况下才识别峰。因此,它也不会标识[5,5,4,3,3,2,3,3]中的任何峰值(即分别重复第一个和最后一个数组元素)。在数组的开头和结尾重复第二个和最后一个元素,或者在开头和结尾插入较低的值将可以将边界点识别为峰。

答案 1 :(得分:0)

findpeaks库可以检测边缘。

pip安装findpeaks

示例:

X = [5,4,3,2,1,2,3,3,2,3,2,4,5,6]
# initialize with smoothing parameter
fp = findpeaks(lookahead=1, interpolate=5)
# fit
results=fp.fit(X)
# Plot
fp.plot()

# Print the xy coordinates.
# The first and last one in the array are the edges.
print(results['df'])

# x  y  labx    valley  peak    labx_topology   valley_topology peak_topology
# 0  5  1.0 True    False   1.0 True    True
# 1  4  1.0 False   False   1.0 False   False
# 2  3  1.0 False   False   1.0 False   False
# 3  2  1.0 False   False   1.0 False   False
# 4  1  1.0 True    False   1.0 True    False
# 5  2  2.0 False   False   2.0 False   False
# 6  3  2.0 False   True    2.0 False   True
# 7  3  2.0 False   False   2.0 False   False
# 8  2  2.0 True    False   2.0 True    False
# 9  3  3.0 False   True    3.0 False   True
# 10 2  3.0 True    False   3.0 True    False
# 11 4  4.0 False   False   4.0 False   False
# 12 5  4.0 True    False   4.0 True    False
# 13 6  4.0 False   False   4.0 False   True

对平滑向量进行拟合: smoothed vector

最终结果将投影回原始向量: input image