2016-02-05 82 views
2

我想将一个给定的函数(特别是np.std())应用于一个测量数组, ,我想将它应用于给定大小的滚动窗口。圆形阵列上的滚动窗口

但是 - 由于测量意图是在一个圆形阵列中 - 我还需要滚动窗口能够从阵列末端重叠到其开始。

因此,我无法使用答案Rolling window for 1D arrays in Numpy? ...我试图改变它的做法,但我不是一个numpy的专家,我无法理解np.lib.stride_tricks.as_strided做什么(它的文档在哪里?)

回答

2

填充足够的值,使“伪圆形”数组的原始数组。然后应用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]] 
+0

它的工作 - 非常感谢!为了简化,我只是在rolling_window()定义 – alessandro

+0

中插入了一行 = np.pad(a,pad_width =(0,windowsize-1),mode ='wrap')作为第一行。我编辑了我的帖子以使用它。由于Erik Rigtorp的“rolling_window”经常被引用,所以我给出了一个不同的名称。 – unutbu