Вопрос:

Роллинг окно для 1D массивов в Numpy?

python numpy window

22908 просмотра

3 ответа

9057 Репутация автора

Есть ли способ эффективно реализовать скользящее окно для одномерных массивов в Numpy?

Например, у меня есть чистый фрагмент кода Python для вычисления скользящих стандартных отклонений для одномерного списка, где observationsэто одномерный список значений и nдлина окна для стандартного отклонения:

stdev = []
for i, data in enumerate(observations[n-1:]):
    strip = observations[i:i+n]
    mean = sum(strip) / n
    stdev.append(sqrt(250*sum([(s-mean)**2 for s in strip])/(n-1)))

Есть ли способ сделать это полностью в Numpy, то есть без каких-либо петель Python? Стандартное отклонение тривиально с numpy.std, но часть скользящего окна полностью ставит меня в тупик.

Я нашел этот пост в блоге о скользящем окне в Numpy, но он не подходит для 1D-массивов.

Автор: c00kiemonster Источник Размещён: 25.07.2011 02:04

Ответы (3)


53 плюса

3004 Репутация автора

Решение

Просто используйте код блога, но примените свою функцию к результату.

т.е.

numpy.std(rolling_window(observations, n), 1)

где у вас есть (из блога):

def rolling_window(a, window):
    shape = a.shape[:-1] + (a.shape[-1] - window + 1, window)
    strides = a.strides + (a.strides[-1],)
    return np.lib.stride_tricks.as_strided(a, shape=shape, strides=strides)
Автор: so12311 Размещён: 25.07.2011 02:17

2 плюса

21 Репутация автора

def moving_avg(x,n):
    mv =  np.convolve(x,np.ones(n)/n,mode='valid')
    return np.concatenate(([np.NaN for k in range(n-1)],mv))
Автор: Boris Wang Размещён: 14.03.2019 09:35

0 плюса

49 Репутация автора

Только с одной строкой кода ...

pd.Series(observations).rolling(n).std()
Автор: Marco Cerliani Размещён: 08.10.2019 12:47
Вопросы из категории :
32x32