Iterando eficientemente con adormecimiento

Hice un código que calcula el valor promedio para cada elemento en el período p para la matriz y

import numpy as np p=4 y =np.asarray([146, 96, 59, 133, 192, 127, 79, 186, 272, 155, 98, 219]) c=len(y)/p print c a=[] for i in range(1,c+1): s=y[p*(i-1):p*i]/np.mean(y[p*(i-1):p*i]) a = np.append(a, s) print a b=[] for i in range(c+1): s = np.mean(a[i::p]) b = np.append(b, s) print b 

¿Hay una manera más eficiente de hacer esto en lugar de usar adjuntar y los bucles for? No necesito ambas matrices solo b

De hecho, haces una operación 2d. Su primera matriz, a, se puede evaluar si se agrega una segunda versión (por ejemplo, con remodelación):

 z = y.reshape(-1, p) w = z/z.mean(axis=1).reshape(-1,1) print w.flatten() # [ 1.34562212 0.88479263 0.5437788 1.22580645 1.31506849 0.86986301 # 0.54109589 1.2739726 1.46236559 0.83333333 0.52688172 1.17741935] 

Tu segundo, b , es una media del resultado anterior:

 print w.mean(axis=0) # [ 1.37435207, 0.86266299, 0.53725214, 1.2257328 ] 

Actualizar

Cuando mencione el suavizado exponencial en los comentarios, es posible que le interesen los paquetes de pandas o statsmodels para tratar series temporales. Vea, por ejemplo, documentos de pandas con algunas herramientas computacionales útiles y este ER en el rastreador de problemas para obtener algunos enlaces útiles sobre la implementación del suavizado exponencial.