2017-02-20 15 views
-1

Я хочу, чтобы восстановить периоды, которые находятся в массиве данных отобранных:Расчет расстояния между изменением знака в оцифрованных данных

signal = [45, 46, -12, -12.5, 32, 35, 34, 25, 23, -23, -65, -3, 43, 23] 

Я хочу, чтобы подсчитать размер периода. Период начинается с положительного числа и переходит к отрицательным числам, а затем возвращается к положительному числу.

Например:

period1=[45 46 -12 -12.5 32] # length=5 
period2=[32 35 34 25 23 -23 -65 -3 43] # length=8 

Как это можно сделать?

+0

Вы неправильно употребляете слово «цикл». Это означает что-то совсем другое. – DyZ

+1

Что вы пробовали? –

+0

Опишите некоторые идеи и проблемы, которые вы наблюдали. Это довольно простая задача. – sascha

ответ

0

Трюк здесь заключается в том, чтобы использовать 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) 
+0

Это работает благодаря –