2011-07-25 28 views
23

有沒有辦法在Numpy中有效地實現1D數組的滾動窗口?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,但滾動窗口部分完全殘留下來。

我發現this博客文章關於Numpy中的滾動窗口,但它似乎不是一維數組。

+0

您還可以看看[瓶頸項目(https://github.com/kwgoodman/瓶頸),它建立在移動平均線,標準等。 – derchambers

回答

36

只需使用博客代碼,但將您的函數應用於結果。

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

它是否適用於任何數據類型? – Lee