Скользящее окно на круглом массиве

Я хочу применить данную функцию (в частности, np.std()) к массиву измерений, и я хотел бы применить ее к скользящему окну заданного размера.

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

Поэтому я не могу использовать ответ в Rolling window для одномерных массивов в Numpy. ? ... Я попытался изменить его подход, но я не эксперт по numpy, и я не смог понять, что делает np.lib.stride_tricks.as_strided (где его документация???)


person alessandro    schedule 05.02.2016    source источник


Ответы (1)


Дополните исходный массив достаточным количеством значений, чтобы получился «псевдокруглый» массив. Затем примените rolling_window к псевдокруговому массиву:

import numpy as np

def rolling_window(a, window):
    # http://www.mail-archive.com/[email protected]/msg29450.html
    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)

def circular_rolling_window(a, window):
    pseudocircular = np.pad(a, pad_width=(0, windowsize-1), mode='wrap')
    return rolling_window(pseudocircular, windowsize)

a = np.arange(5)
windowsize = 3
print(circular_rolling_window(a, windowsize))

урожаи

[[0 1 2]
 [1 2 3]
 [2 3 4]
 [3 4 0]
 [4 0 1]]
person unutbu    schedule 05.02.2016
comment
Это сработало - большое спасибо! Для упрощения я просто вставил вашу строку a = np.pad(a, pad_width=(0, размер окна-1), mode='wrap') в качестве первой строки в определении roll_window() - person alessandro; 05.02.2016
comment
Это хорошая идея; Я отредактировал свой пост, чтобы использовать его. Поскольку roll_window Эрика Ригторпа часто цитируется в SO, я дал кольцевой версии другое имя. - person unutbu; 05.02.2016