Как отсортировать массив и найти два самых высоких пика после использования find_peaks от Scipy - PullRequest
0 голосов
/ 09 октября 2018

Я немного борюсь с find_peaks ...

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

peak_data = signal.find_peaks(spline, height=0.3, distance=50)

Я могу использовать это, чтобы получить значения x и y в индексных точках в peak_data

peak_vals = spline[peak_data[0]]
time_vals = xnew[peak_data[0]] # xnew being thee splined x-axis

Я думал, что смогу заказать peak_vals иоставьте первые два значения (то есть наивысшие и вторые наивысшие пики), а затем используйте их для получения времени от xnew, которое совпадает с этими значениями.Тем не менее, я не могу использовать .sort, который возвращает

AttributeError: 'tuple' object has no attribute 'sort'

или sorted(), который возвращает

TypeError: '>' not supported between instances of 'int' and 'dict'

Я думаю, это потому, что он индексируется из массива Numpy (сплайновые данные) и, следовательно, создает еще один пустой массив, который затем не работает ни с одной из команд сортировки.

Лучшее, что я могу сделать, - это перейти к новому списку, а затем получить первые два значения из этого:

peak_val1=[]

peak_vals = spline[peak_data[0]]
    for i in peak_val_d:
        peak_val1.append(i)
peak_val1.sort(reverse=True)
peak_val2 = peak_val1[0:2]

Это работает, но, похоже, очень длинный и сложный способ сделать этоучитывая, что мне все еще нужно индексировать значения времени.Я уверен, что должен быть более быстрый (более простой) способ?

Добавлено Примечание: я понимаю, что find_peaks возвращает список индексов, но на самом деле, кажется, он содержит значения индекса и max в массиве-словарь??(извините, я очень плохо знаком с Python, а фигурные скобки означают словарь, но это не похоже на простую диктовку).В любом случае ... print(peak_data) возвращает как позиции индекса, так и их значения.

(array([ 40, 145, 240, 446]), {'peak_heights': array([0.34588031, 0.43761898, 0.45778744, 0.74167977])})

Возможно, есть прямой доступ к этим данным?

1 Ответ

0 голосов
/ 10 октября 2018

Просто отправив это сообщение, если у кого-то еще возникнут аналогичные проблемы, и напомню себе внимательно прочитать документы в будущем!

Если дополнительных аргументов нет, find_peaks() возвращает кортеж, содержащий массив индексовпиковые значения и словарь фактических пиковых значений.Как только я понял это, довольно просто выполнить распаковку последовательности, чтобы создать отдельный массив и словарь.Поэтому, если бы я начал с

peak_data = signal.find_peaks(spline, height=0.3, distance=50)

, все, что мне нужно было сделать, - это распаковать две переменные

peak_index, dict_vals = peak_data

Теперь у меня есть индекс и значения в порядке их идентификации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...