[SciPy-User] Accumulation sum using indirect indexes

Dan Goodman dg.gmane@thesamovar....
Fri Feb 3 23:03:04 CST 2012


For the project I'm working on we have quite a specific case of this to 
handle, where we have (1) generally have few repeats of the ids, (2) 
arbitrary operations to be applied, not just addition. I've just been 
working on an optimised numpy-only solution to this and it might be of 
interest to others. It works particularly well with few repeats, but I 
think it's no slower than other solutions if there are many repeats, at 
least until it gets to be mostly repeats at which points doing a simple 
loop is faster. For the case of just addition (the case below), a method 
using sorting and reduceat is probably quicker (I didn't do a 
comparison), but I thought it might be useful for many people to have an 
efficient solution for the general case. And if anyone knows a better 
one, I'd be very interested! It's still far from close to ideal, for the 
typical case it's about 10-20x slower than doing it with C++ (I used 
weave to test it), but also about 10-20x faster than doing it with a loop.

I've attached the code (function apply_batch, the others are for 
comparison). If anyone's interested I can comment on the code, but it's 
basically the trick used by unique(), sorting the indices and comparing 
adjacent ones.

Dan

On 31/01/2012 21:34, Alexander Kalinin wrote:
> Hello!
>
> I use SciPy in computer graphics applications. My task is to calculate
> vertex normals by averaging faces normals. In other words I want to
> accumulate vectors with the same ids. For example,
>
> ids = numpy.array([0, 1, 1, 2])
> n = numpy.array([ [0.1, 0.1, 0.1], [0.1, 0.1, 0.1], [0.1, 0.1, 0.1],
> [0.1, 0.1 0.1] ])
>
> I need result:
> nv = ([ [0.1, 0.1, 0.1], [0.2, 0.2, 0.2], [0.1, 0.1, 0.1]])
>
> The most simple code:
> nv[ids] += n
> does not work, I know about this. For 1D arrays I use
> numpy.bincount(...) function. But this function does not work for 2D arrays.
>
> So, my question. What is the best way calculate accumulation sum for 2D
> arrays using indirect indexes?
>
> Sincerely,
> Alexander
>
>
> _______________________________________________
> SciPy-User mailing list
> SciPy-User@scipy.org
> http://mail.scipy.org/mailman/listinfo/scipy-user
-------------- next part --------------
An embedded and charset-unspecified text was scrubbed...
Name: batch_apply.py
Url: http://mail.scipy.org/pipermail/scipy-user/attachments/20120204/28bdebf1/attachment.pl 


More information about the SciPy-User mailing list