2011-07-25 11 views
23

Czy istnieje sposób na wydajne zaimplementowanie ruchomego okienka dla macierzy 1D w Numpy?Rolling window dla tablic 1D w Numpy?

Na przykład mam ten czystego kodu Pythona fragment do obliczenia toczenia odchylenia standardowe dla listy 1D, gdzie observations lista 1D wartości, a n jest długością okna dla odchylenia standardowego:

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

Czy istnieje sposób, aby zrobić to całkowicie w Numpy, tj. Bez pętli Pythona? Odchylenie standardowe jest banalne z numpy.std, ale część okna toczenia całkowicie mnie obija.

Znalazłem this wpis na blogu dotyczący ruchomego okienka w Numpy, ale nie wydaje się, że jest to tablica 1D.

+0

Można również spojrzeć na projekt wąskiego gardła [] (https://github.com/kwgoodman/ wąskie gardło), ma wbudowaną średnią ruchomą, std, itp. – derchambers

Odpowiedz

36

Po prostu użyj kodu blogu, ale zastosuj swoją funkcję do wyniku.

tj

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

gdzie trzeba (z bloga):

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

Czy jest ważna dla dowolnego typu danych? – Lee