[Numpy-discussion] repeat an array without allocation

srean srean.list at gmail.com
Mon May 5 03:34:25 EDT 2014


Great ! thanks. I should have seen that.

Is there any way array multiplication (as opposed to matrix multiplication)
can be sped up without forming A and (A * b) explicitly.

A = np.repeat(x, [4, 2, 1, 3], axis = 0)    # A.shape == 10,10
c = sum(b * A, axis = 1)                        # b.shape == 10,10

In my actual setting b is pretty big, so I would like to avoid creating
another array the same size. I would also like to avoid a Python loop.

st = 0
for (i,rep) in enumerate([4, 2, 1, 3]):
     end = st + rep
     c[st : end] = np.dot(b[st : end, :], a[i,:])
     st  = end

Is Cython the only way ?


On Mon, May 5, 2014 at 1:20 AM, Jaime Fernández del Río <
jaime.frio at gmail.com> wrote:

> On Sun, May 4, 2014 at 9:34 PM, srean <srean.list at gmail.com> wrote:
>
>> Hi all,
>>
>>   is there an efficient way to do the following without allocating A where
>>
>>  A = np.repeat(x, [4, 2, 1, 3], axis=0)
>>  c = A.dot(b)    # b.shape
>>
>
> If x is a 2D array you can call repeat **after** dot, not before, which
> will save you some memory and a few operations:
>
> >>> a = np.random.rand(4, 5)
> >>> b = np.random.rand(5, 6)
> >>> np.allclose(np.repeat(a, [4, 2, 1, 3], axis=0).dot(b),
> ...             np.repeat(a.dot(b), [4, 2, 1, 3], axis=0))
> True
>
> Similarly, if x is a 1D array, you can sum the corresponding items of b
> before calling dot:
>
> >>> a = np.random.rand(4)
> >>> b = np.random.rand(10)
> >>> idx = np.concatenate(([0], np.cumsum([4,2,1,3])[:-1]))
> >>> np.allclose(np.dot(np.repeat(a, [4,2,1,3] ,axis=0), b),
> ...             np.dot(a, np.add.reduceat(b, idx)))
> ... )
> True
>
> Jaime
>
> --
> (\__/)
> ( O.o)
> ( > <) Este es Conejo. Copia a Conejo en tu firma y ayúdale en sus planes
> de dominación mundial.
>
> _______________________________________________
> NumPy-Discussion mailing list
> NumPy-Discussion at scipy.org
> http://mail.scipy.org/mailman/listinfo/numpy-discussion
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/numpy-discussion/attachments/20140505/6951803f/attachment.html>


More information about the NumPy-Discussion mailing list