Counting Peaks in a Time Series
我在数一个麻木的数组中的峰和谷的数目。
我有一个这样的麻木数组:
1 | stack = np.array([0,0,5,4,1,1,1,5,1,1,5,1,1,1,5,1,1,5,1,1,5,1,1,5,1,1,5,1,1]) |
标绘后,此数据如下所示:
。
我正在寻找这个时间序列中峰值的数量:
这是我的代码,对于这样一个在时间序列表示中有清晰的峰和谷的例子,它工作得很好。我的代码返回找到峰值的数组的索引。
1 2 3 4 5 6 7 8 9 10 11 | #example import numpy as np from scipy.signal import argrelextrema stack = np.array([0,0,5,4,1,1,1,5,1,1,5,1,1,1,5,1,1,5,1,1,5,1,1,5,1,1,5,1,1]) # for local maxima y = argrelextrema(stack, np.greater) print(y) |
号
结果:
1 | (array([ 2, 7, 10, 14, 17, 20, 23, 26]),) |
已发现8个清晰的峰,可以正确计数。
我的解决方案似乎无法很好地处理不太清晰、更混乱的数据。
下面的数组无法正常工作,也找不到我需要的峰值:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | array([ 0. , 5.70371806, 5.21210157, 3.71144767, 3.9020162 , 3.87735984, 3.89030171, 6.00879918, 4.91964227, 4.37756275, 4.03048542, 4.26943028, 4.02080471, 7.54749062, 3.9150576 , 4.08933851, 4.01794766, 4.13217794, 4.15081972, 8.11213474, 4.6561735 , 4.54128693, 3.63831552, 4.3415324 , 4.15944019, 8.55171441, 4.86579459, 4.13221943, 4.487663 , 3.95297979, 4.35334706, 9.91524674, 4.44738182, 4.32562141, 4.420753 , 3.54525697, 4.07070637, 9.21055852, 4.87767969, 4.04429321, 4.50863677, 3.38154581, 3.73663523, 3.83690315, 6.95321174, 5.11325128, 4.50351938, 4.38070175, 3.20891173, 3.51142661, 7.80429569, 3.98677631, 3.89820773, 4.15614576, 3.47369797, 3.73355768, 8.85240649, 6.0876192 , 3.57292324, 4.43599135, 3.77887259, 3.62302175, 7.03985076, 4.91916556, 4.22246518, 3.48080777, 3.26199699, 2.89680969, 3.19251448]) |
。
绘制的数据如下:
氧化镁
同样的代码返回:
1 2 | (array([ 1, 4, 7, 11, 13, 15, 19, 23, 25, 28, 31, 34, 37, 40, 44, 50, 53, 56, 59, 62]),) |
此输出错误地将数据点计数为峰值。
理想输出
理想输出应返回清晰峰值的数量,在这种情况下,11位于索引处:
1 | [1,7,13,19,25,31,37,44,50,56,62] |
。
我相信我的问题是因为argrextrema函数的聚合性质。
您可以使用一些阈值来查找峰值:
1 2 3 4 5 6 7 8 9 10 11 | prev = stack[0] or 0.001 threshold = 0.5 peaks = [] for num, i in enumerate(stack[1:], 1): if (i - prev) / prev > threshold: peaks.append(num) prev = i or 0.001 print(peaks) # [1, 7, 13, 19, 25, 31, 37, 44, 50, 56, 62] |
号
看起来
例如,如果不希望峰值小于5,可以这样做:
1 2 3 4 5 6 7 8 9 | In [17]: result = argrelextrema(a, np.greater) In [18]: result Out[18]: (array([ 1, 4, 7, 11, 13, 15, 19, 23, 25, 28, 31, 34, 37, 40, 44, 50, 53, 56, 59, 62]),) In [19]: result[0][a[result[0]] > 5] Out[19]: array([ 1, 7, 13, 19, 25, 31, 37, 44, 50, 56, 62]) |