Я немного борюсь с 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])})
Возможно, есть прямой доступ к этим данным?