如何找到数组中第一个峰值之后的第一个最小值?

时间:2019-07-19 20:57:43

标签: python python-2.7 numpy scipy

我试图找到数据数组中第一个峰值之后的第一个最小值。这是我的代码:

x = array

mins = argrelextrema(x, np.less)[0]
mins_above_zero = np.where(x[mins] > 0)[0]
ag = x[mins[mins_above_zero]].argmin()
true_minimum_index = mins[ag]

pyplot.scatter(mins, x[mins])
pyplot.plot(x)
pyplot.ylim(0, 2000)

当前选择的最小值太多。

如果我有一个像这样的numpy数组:

array([  0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,   0.,
         0.,   0.,   0.,   1.,   0.,   0.,   0.,   0.,   1.,   0.,   0.,
         0.,   0.,   0.,   0.,   0.,   0.,   0.,   1.,   0.,   1.,   0.,
         0.,   0.,   1.,   1.,   0.,   0.,   2.,   0.,   2.,   1.,   3.,
         1.,   2.,   5.,   8.,   6.,  55., 396., 608., 157.,  40.,  45.,
        43.,  51.,  74.,  89., 107., 121.,  98., 111., 122., 170., 187.,
       190., 229., 284., 372., 450., 457., 327., 328., 318., 288., 290.,
       262., 235., 223., 177., 232., 217., 234., 261., 206., 192., 221.,
       189., 181., 185., 162., 140., 144., 171., 176., 168., 213., 222.,
       314., 397., 413., 429., 442., 352., 416., 439., 424., 480., 479.,
       515., 522., 569., 543., 626., 666., 637., 680., 678., 747., 720.,
       695., 674., 605., 490., 475., 332., 284., 252., 169., 140., 117.,
        86.,  71.,  58.,  55.,  37.,  45.,  35.,  25.,  21.,  16.,  14.,
        17.,  12.,   9.,   7.,   6.,   0.,   6.,   6.,   6.,   3.,   1.,
         1.,   4.,   2.,   1.,   4.,   0.,   2.,   2.,   0.,   1.,   2.,
         0.,   0.,   4.,   0.,   1.,   1.,   0.,   0.,   0.,   0.,   0.,
         0.,   1.,   1.,   0.])

除了只有第一个峰之后的最小值外,这会创建这样的图:

enter image description here

2 个答案:

答案 0 :(得分:2)

尝试按argrelextrema

的顺序播放

使用阵列数据:

x = array

# Order 2 looks at more than just the immediate numbers around a variable
mins = argrelextrema(x, np.less, order=2)[0]
print(mins)
mins_above_zero = np.where(x[mins] > 0)[0]
ag = x[mins[mins_above_zero]].argmin()
true_minimum_index = mins[ag]

#Grabs the first relative minimum
mins = mins[0]

pyplot.scatter(mins, x[mins])
pyplot.plot(x)
pyplot.ylim(0, 2000)

哪个创建:

enter image description here

答案 1 :(得分:0)

希望对您有所帮助:)

mins = argrelextrema(x, np.less)[0]
mins_above_zero = np.where(x[mins] > 0)[0]
ag = x[mins[mins_above_zero]].argmin()
true_minimum_index = mins[ag]

pyplot.scatter(mins, x[mins])
pyplot.plot(x)
pyplot.ylim(0, 2000)

mins = argrelextrema(x, np.less)[0]
mins_above_zero = np.where(x[mins] > 0)[0]
ag = x[mins[mins_above_zero]].argmin()
true_minimum_index = mins[ag]


fig, ax = plt.subplots(figsize=(20, 20))
for i in mins:
    ax.annotate('min', xy=(i,x[i]),xycoords='data',
            xytext=(-15, 25), textcoords='offset points',
            arrowprops=dict(facecolor='black', shrink=0.05),
            horizontalalignment='right', verticalalignment='bottom')
pyplot.scatter(mins, x[mins])
pyplot.plot(x)
pyplot.ylim(0, 2000)