Найти ближайший минимум к пику - PullRequest
0 голосов
/ 28 июня 2019

Я использую scipy.singal.find_peaks, чтобы найти пики и минимы, используя:

import numpy as np
from scipy.signal import find_peaks

x=np.array([9.8,57.,53.,37.,24.,19.,16.,15.,13.,13.,12.,12.,11.,11.,11.,11.,11.,11.,10.,13.,13.,13.,15.,13.,12.,14.,15.,14.,51.,34.,24.,20.,24.,22.,18.,57.,63.,38.,27.,28.,31.,33.,94.,71.,48.,40.,43.,39.,31.,27.,22.,21.,20.,19.,18.,18.,19.,20.,20.,49.,62.,48.,43.,34.,33.,28.,26.,26.,24.,23.,23.,26.,27.,70.,97.,57.,46.,68.,82.,59.,49.,37.,40.,45.,36.,33.,28.,22.,23.,284.,524.,169.,111.,148.,98.,68.,50.,38.,30.,28.])
peaks, _ = find_peaks(x)
mins, _ =find_peaks(x*-1)

Что выглядит как:

enter image description here

Теперь мне интересно найти ближайшие минимумы к каждой вершине.Поэтому я могу понять разницу между ними.

После просмотра документации find_peaks аргумент peak_prominece выглядит так, как я ищу.

prominences = peak_prominences(x, peaks)[0]
contour_heights = x[peaks] - prominences

Что выглядит следующим образом:

enter image description here

После проверки peak_prominences обнаружил минимум, предшествующий пику.Для моего приложения мне нужен ближайший пик, независимо от того, предшествовал он или следовал.

Как я могу использовать mins, чтобы определить параметр wlen для вычисления peak_prominence .?

Поскольку mins состоит из индексов минимумов, как я могу использовать его для определения wlen?Я бы в основном должен был найти индексы в мин, которые ограничивают каждый пик (то есть peaks[i]).

Есть ли лучший способ добиться этого, просто используя mins и peaks?

1 Ответ

1 голос
/ 28 июня 2019

Теперь мне интересно найти ближайшие минимумы к каждому пику.Так что я могу взять разницу между ними.

Это то, что вы ищете?

closest_mins = [mins[np.argmin(np.abs(x-mins))] for x in peaks]
difference = x[peaks]-x[closest_mins]
print(difference)
[ 47.   3.   1.  37.   4.  45.  54.   3.  44.  51.  36.   8. 413.  37.]

Нижеграфик пар peaks, mins и peaks -closest mins, обозначенных пунктирными линиями.Обратите внимание, что есть mins, которые являются ближайшими к более чем одному peaks.

plt.plot(x)
plt.plot(peaks, x[peaks],'o', label = 'peaks')
plt.plot(mins, x[mins],'s', label = 'mins')
plt.plot(closest_mins, x[closest_mins],'*', label = 'closest mins')

for p, m in zip(peaks, closest_mins):
    plt.plot([p,m], [x[p], x[m]], 'k', dashes = (4,1))
plt.legend();

enter image description here

...