I'm writing a moving average (MA) function that uses the convolve function in NumPy, which should be equivalent to a weighted moving average (WMA). When my weights are all equal (as in a simple arithmetic average), it works fine: data = numpy.arange(1, 11) numdays = 5 w = [1.0/numdays]*numdays numpy.convolve(data, w, 'valid') It gives: array([ 3., 4., 5., 6., 7., 8.]) However, when I try to use a weighted average w = numpy.cumsum(numpy.ones(numdays, dtype=float), axis=0); w = w/numpy.sum(w) instead of the (for the same data) 3.667, 4.667, 5.667, 6.667,... I expect, I get array([ 2.33333333, 3.33333333, 4.33333333, 5.33333333, 6.33333333, 7.33333333]) If I remove the 'valid' flag, I don't even see the correct values. I would really like to use convolve for the WMA as well as MA as it makes the code cleaner (same code, different weights) and otherwise I think I'll have to loop through all the data and take slices. What causes this behavior? Continue reading...