2011-07-25 653 views
23

¿Hay alguna forma de implementar eficientemente una ventana rotativa para matrices 1D en Numpy?¿Ventana giratoria para matrices 1D en Numpy?

Por ejemplo, tengo este fragmento de código Python puro para calcular las desviaciones estándar de rodadura para una lista 1D, donde observations es la lista 1D de valores y n es la longitud de la ventana para la desviación estándar:

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

¿Hay alguna manera de hacer esto completamente dentro de Numpy, es decir, sin ningún bucle de Python? La desviación estándar es trivial con numpy.std, pero la parte de la ventana rodante me topa por completo.

Encontré this publicación de blog con respecto a una ventana en blanco en Numpy, pero no parece ser para matrices 1D.

+0

También puede echar un vistazo a la [proyecto de cuello de botella] (https://github.com/kwgoodman/ cuello de botella), ha incorporado el promedio móvil, estándar, etc. – derchambers

Respuesta

36

Simplemente use el código del blog, pero aplique su función al resultado.

es decir

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

donde se tiene (del blog):

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

¿Es válido para cualquier tipo de datos? – Lee

Cuestiones relacionadas