Подтвердить что ты не робот

Катящееся окно для 1D массивов в Numpy?

Есть ли способ эффективно реализовать развертку окна для 1D массивов в Numpy?

Например, у меня есть этот чистый фрагмент кода на Python для вычисления стандартных отклонений для 1D-списка, где observations - 1D-список значений, а 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 массивов.

4b9b3361

Ответ 1

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

то есть.

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)

Ответ 2

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))

Ответ 3

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

pd.Series(observations).rolling(n).std()