[Numpy-discussion] Help in speeding up accumulation in a matrix

josef.pktd at gmail.com josef.pktd at gmail.com
Sat Jan 29 22:05:14 EST 2011


On Sat, Jan 29, 2011 at 5:30 PM, Charles R Harris
<charlesr.harris at gmail.com> wrote:
>
>
> On Sat, Jan 29, 2011 at 2:01 PM, Nicolas SCHEFFER
> <scheffer.nicolas at gmail.com> wrote:
>>
>> Hi all,
>>
>> First email to the list for me, I just want to say how grateful I am
>> to have python+numpy+ipython etc... for my day to day needs. Great
>> combination of software.
>>
>> Anyway, I've been having this bottleneck in one my algorithms that has
>> been bugging me for quite a while.
>> The objective is to speed this part up. I've been doing tons of
>> optimization and parallel processing around that piece of code to get
>> a decent run time.
>>
>> The problem is easy. You want to accumulate in a matrix, a weighted
>> sum of other matrices. Let's call this function scale_and_add:
>> def scale_and_add_re(R,w,Ms):
>>    (nb_add,mdim,j)=np.shape(Ms)
>>    for i in range(nb_add):
>>        R+=w[i]*Ms[i]
>>    return R
>> This 'for' loop bugs me since I know this will slow things down.
>>
>
> I'd put the flattened matrices in a stack, weight in place, sum on the first
> index, and reshape. Something like
>
> In [1]: m = array([eye(3)]*4).reshape(4,-1)

using triu_indices instead of reshape would cut the memory consumption

ind1, ind2 = np.triu_indices(?,?)
m = m[:, ind1, ind2]

I have no idea how expensive the indexing is in this case

 Josef

>
> In [2]: m
> Out[2]:
> array([[ 1.,  0.,  0.,  0.,  1.,  0.,  0.,  0.,  1.],
>        [ 1.,  0.,  0.,  0.,  1.,  0.,  0.,  0.,  1.],
>        [ 1.,  0.,  0.,  0.,  1.,  0.,  0.,  0.,  1.],
>        [ 1.,  0.,  0.,  0.,  1.,  0.,  0.,  0.,  1.]])
>
> In [3]: w = array([1.,2.,3.,4.])
>
> In [4]: m *= w[:,None]
>
> In [5]: r = m.sum(0).reshape(3,3)
>
> In [6]: r
> Out[6]:
> array([[ 10.,   0.,   0.],
>        [  0.,  10.,   0.],
>        [  0.,   0.,  10.]])
>
> This should fit in memory I think, depending of course on how much memory
> you have.
>
> <snip>
>
> Chuck
>
> _______________________________________________
> NumPy-Discussion mailing list
> NumPy-Discussion at scipy.org
> http://mail.scipy.org/mailman/listinfo/numpy-discussion
>
>



More information about the NumPy-Discussion mailing list