[Numpy-discussion] custom accumlators
Matt Knox
mattknox_ca at hotmail.com
Fri Jan 5 13:29:19 EST 2007
>
> On Friday 05 of January 2007 17:42, Matt Knox wrote:
> > ---------------------------------------------
> > Example 1 - exponential moving average:
> >
> > # naive brute force method...
> > def expmave(x, k):
> > result = numpy.array(x, copy=True)
> > for i in range(1, result.size):
> > result[i] = result[i-1] + k * (result[i] - result[i-1])
> > return result
> >
> > # slicker method (if it worked, which it doesn't)...
> > def expmave(x, k):
> > def expmave_sub(a, b):
> > return a + k * (b - a)
> > return numpy.vectorize(expmave_sub).accumulate(x)
>
> Why can't you simply use list comprehensions? Too slow?
>
> For example:
> def expmave(x, k):
> return [x[0]] + [x[i-1] + k*(x[i]-x[i-1]) for i in range(1,len(x))]
>
> Karol
>
That's not the same calculation. There is no cumulative effect in your function.
Each iteration depends on the previous iteration, like a cumulative sum, etc.
And as for the speed, I'm basically trying to determine what is the most
efficient way to do it, outside of writing it in C. And I don't really want to
create intermediate lists, ideally things would be kept as numpy arrays.
I can't think of a loop free way to do it with numpy.
Good try though. No harm in trying! That's the only way we learn things.
- Matt
More information about the NumPy-Discussion
mailing list