Получить пики в сюжете Python - PullRequest
0 голосов
/ 28 февраля 2019

У меня есть следующие данные:

data = np.array([ 0.,  0.,  0., 94., 30., 30., 30., 31., 29., 30., 29., 28., 26.,
       29., 28., 29., 31., 32., 31., 29., 31., 31., 30., 34., 28., 31.,
        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  2.,  0.,
        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  1.,  0.,  0.,  0.,
        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0., 54.,  9.,  9.,  7.,  7.,
       14., 18., 13.,  8.,  2.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
        0.,  0.])

Если я построю график, он будет выглядеть так:

enter image description here

Теперь я хотел бы автоматически определить точки красным цветом. Есть идеи, как мне это сделать?

РЕДАКТИРОВАТЬ: Попытка scipy.signal, но она не определяет пики правильно, по крайней мере с конфигурацией по умолчанию:

from matplotlib import pyplot as plt
from scipy.signal import find_peaks
peaks, _ = find_peaks(data, height=20)
plt.plot(data)
plt.plot(peaks, data[peaks], "x")
plt.show()

enter image description here

Ответы [ 2 ]

0 голосов
/ 28 февраля 2019

scipy.signal работает (по крайней мере, чаще всего), если вы дадите ему правильное сглаживание.Вы также можете использовать вейвлет-преобразование (find_peaks_cwt), которое сглаживает использование вейвлета и, таким образом, работает немного лучше, чем find_peaks для шумных данных

from matplotlib import pyplot as plt
from scipy.signal import find_peaks_cwt
peaks = find_peaks_cwt(data, widths=np.ones(data.shape)*2)-1
plt.plot(data)
plt.plot(peaks, data[peaks], "x")
plt.show()

enter image description here

0 голосов
/ 28 февраля 2019

Существует алгоритм Дугласа-Пекера, см. https://stackoverflow.com/a/49377181/562769

Идея состоит в том, чтобы упростить эту линию, пока у вас не останутся только наиболее важные точки.Затем вы берете каждую точку выше порогового значения (например, выше среднего) и у вас есть пики.

Я смутно помню, что обработка сигналов scipy имеет более сложный подход

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