Трюк здесь заключается в том, чтобы использовать numpy.diff() дважды. Первый дифференциал может быть использован для поиска переходов. Второй diff можно использовать для нахождения расстояния между этими пересечениями.
Код:
import numpy as np
# put the data into a numpy array
signal = np.array(
[45, 46, -12, -12.5, 0, 32, 35, 34, 25, 23, -23, -65, -3, 43, 23])
# consider zeros to be negative, since we are looking for return to positive
signal[np.where(signal == 0.0)] = -1e-100
# find any returns to positive
return_to_positive = 1 + np.where(2 == np.diff(np.sign(signal)))[0]
# the periods are the distance between `return to positives`
periods = np.diff(return_to_positive)
Выход:
>>> print(periods)
[8]
Волшебное Разъяснение:
Мы в первую очередь необходимо обеспечить там нет нулей Ушло данных. Это потому, что мы хотим, чтобы чистый пересечения нуля. Установите нулевые значения нулей, так как мы хотим, чтобы первое положительное значение было началом периода.
# consider zeros to be negative, since we are looking for return to positive
signal[np.where(signal == 0.0)] = -1e-100
Возьмите знак сигнала, а затем выполните его. Где-то это 2
, где сигнал идет от отрицательного к положительному. Добавьте 1
к индексам, потому что предыдущий diff
удалил один элемент из массива. (Примечание стороны, pandas
делает это для вас)
# find the indices for any returns to positive
return_to_positive = 1 + np.where(2 == np.diff(np.sign(signal)))[0]
Наконец, возьмем расстояние между индексами для каждого пересечения нуля, чтобы получить периоды.
# the periods are the distance between `return to positives`
periods = np.diff(return_to_positive)
Вы неправильно употребляете слово «цикл». Это означает что-то совсем другое. – DyZ
Что вы пробовали? –
Опишите некоторые идеи и проблемы, которые вы наблюдали. Это довольно простая задача. – sascha