For operations which may be reduced to sums (this includes average and std), you can use cumulative sum:
A = arange(10.0) w = 2 # window length C = zeros_like(A)
B = A.cumsum() C[w:] = (B[w:] - B[:-w]) / w # running average C[:w] = B[:w] / arange(1,w+1) # just average for first elements
print vstack((A, C)) [[ 0. 1. 2. 3. 4. 5. 6. 7. 8. 9. ] [ 0. 0.5 1.5 2.5 3.5 4.5 5.5 6.5 7.5 8.5]]
Denis On 12/23/06, Matt Knox <mattknox_ca@hotmail.com> wrote:
Does anyone know of a slick way to calculate a simple moving average and/or moving standard deviation? And when I say slick, I mean loop-free way, because it would be fairly easy to code a looping way of doing it, it would just be really slow.
To be more specific, when I say moving standard deviation, I mean for example...
if A is a 1-dimensional array with 100 elements, and I'm using a window size of 10, then the result at index 10 would be A[0:10].std(), the result at index 11 would be A[1:11].std() , etc...
And similarly for moving average, and so forth. Is their a general way to do these kind of things? Or would it have to be a special case for each type of calculation to avoid looping?
Any help is greatly appreciated. Thanks in advance,
- Matt