a = np.ones(30)
idx = np.array([2, 3, 2])
a += 2 * np.bincount(idx, minlength=len(a))
>>> a
array([ 1.,  1.,  5.,  3.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,
        1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,
        1.,  1.,  1.,  1.])

As for speed:

def loop(a, idx):
    for i in idx:
        a[i] += 2

def count(a, idx):
    a += 2 * np.bincount(idx, minlength=len(a))

%timeit loop(np.ones(30), np.array([2, 3, 2]))
10000 loops, best of 3: 19.9 us per loop

%timeit count(np.ones(30), np.array(2, 3, 2]))
100000 loops, best of 3: 19.2 us per loop

So no big difference here.  But go to larger systems and you'll see a huge difference:

%timeit loop(np.ones(10000), np.random.randint(10000, size=100000))
1 loops, best of 3: 260 ms per loop

%timeit count(np.ones(10000), np.random.randint(10000, size=100000))
100 loops, best of 3: 3.03 ms per loop.

~Brett


On Fri, Feb 22, 2013 at 8:38 PM, santhu kumar <mesanthu@gmail.com> wrote:
Sorry typo :

a = np.ones(30)
idx = np.array([2,3,2]) # there is a duplicate index of 2
a[idx] += 2

On Fri, Feb 22, 2013 at 8:35 PM, santhu kumar <mesanthu@gmail.com> wrote:
Hi all,

I dont want to run a loop for this but it should be possible using numpy "smart" ways.

a = np.ones(30)
idx = np.array([2,3,2]) # there is a duplicate index of 2
a += 2

>>>a
array([ 1.,  1.,  3.,  3.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,
        1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,
        1.,  1.,  1.,  1.])


But if we do this :
for i in range(idx.shape[0]):
       a[idx[i]] += 2

>>> a
array([ 1.,  1.,  5.,  3.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,
        1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,
        1.,  1.,  1.,  1.])

How to achieve the second result without looping?? 
Thanks
Santhosh


_______________________________________________
NumPy-Discussion mailing list
NumPy-Discussion@scipy.org
http://mail.scipy.org/mailman/listinfo/numpy-discussion