Найти локальные максимумы, используя scipy.signal - PullRequest
0 голосов
/ 19 ноября 2018

У меня есть 1D массив (A) 64 целочисленных значений.Как найти 2 локальных максимума, соответствующих значениям 56 и 50 (индексы 10 и 45 соответственно), с помощью модуля scipy.signal?

Сначала я попытался импортировать

from scipy.signal import find_peaks

A
array([  0.,   1.,   3.,   8.,   6.,  16.,  29.,  29.,  47.,  42.,  56.,
    44.,  49.,  40.,  34.,  34.,  26.,  24.,  25.,  21.,  22.,  24.,
    34.,  17.,  17.,  29.,  24.,  26.,  13.,  25.,  16.,  19.,  19.,
    26.,  24.,  26.,  41.,  34.,  24.,  37.,  37.,  39.,  34.,  40.,
    45.,  50.,  28.,  45.,  43.,  46.,  47.,  41.,  30.,  23.,  19.,
    15.,   9.,  10.,   3.,   6.,   4.,   1.,   1.,   0.])

но прежде чем я получил дальнейшее развитие, я получил сообщение об ошибке, что

"AttributeError: у объекта 'module' нет атрибута 'find_peaks'",

так что вместо этого я попытался импортировать

from scipy import signal
peakind = signal.find_peaks_cwt(A, widths=32)

, но затем я получаю сообщение об ошибке, что

«TypeError: объект int не может быть подписан».

Я все еще получаю это сообщение об ошибке, даже если я сначала делаю A.astype(np.int64).

Не могу ли я использовать scipy.signal_find_peaks для массива целочисленных значений?

1 Ответ

0 голосов
/ 23 ноября 2018

Вы можете использовать find_peaks следующим образом (убедитесь, что вы работаете с SciPy> = 1.1):

from scipy.signal import find_peaks
import numpy as np
import matplotlib.pyplot as plt

A = np.array([0.,   1.,   3.,   8.,   6.,  16.,  29.,  29.,  47.,  42.,  56.,
    44.,  49.,  40.,  34.,  34.,  26.,  24.,  25.,  21.,  22.,  24.,
    34.,  17.,  17.,  29.,  24.,  26.,  13.,  25.,  16.,  19.,  19.,
    26.,  24.,  26.,  41.,  34.,  24.,  37.,  37.,  39.,  34.,  40.,
    45.,  50.,  28.,  45.,  43.,  46.,  47.,  41.,  30.,  23.,  19.,
    15.,   9.,  10.,   3.,   6.,   4.,   1.,   1.,   0.])

peaks, _ = find_peaks(A, distance=32)
print(peaks)
# This prints the desired indices [10 45]

plt.plot(A)
plt.plot(peaks, A[peaks], "x")
plt.show()

Таким образом, вместо использования widths, вы используете distance, который определяет минимальное расстояние между двумя пиками.

Это будет сюжет:

enter image description here

Как видите, только два желаемых пика отмечены x, а все остальные локальные максимумы игнорируются.

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