[SciPy-user] fancy indexing and +=
A. M. Archibald
peridot.faceted at gmail.com
Fri Sep 1 17:27:51 EDT 2006
Hi,
I'm trying to figure out how to use fancy indexing for ordinary
(non-sparse) arrays. On reading, it's clear enough what is meant:
a = arange(3)
a[[1,1,2]]
-> array([1,1,2])
But when writing it's not so clear what should happen:
a[[1,1,2]] = array([1,2,3])
a
-> array([0,2,3])
All right, the assignment a[1]=... has been done twice, so I only see
the effects of the second. Fair enough. But:
a[[1,1,2]] += 1
a
-> array([0,3,4])
That is, a[[1,1,2]] += 1 is equivalent to
a[[1,1,2]] = a[[1,1,2]] + 1
and not
for i in [1,1,2]:
a[i]+=1
Is this really intended? It's surprising, it seems like that forces
numpy to make a copy, and it leaves me with the question of how to
implement the second without a loop... Well, for a better example:
x = array([...])
i1 = ravel(ix_(arange(len(x)),arange(len(x)))[...,0])
i2 = ravel(ix_(arange(len(x)),arange(len(x)))[...,1])
dx = f(x[i1],x[i2]) # compute all the pairwise interactions
# x[i1] += dx
for (i,a) in enumerate(i1):
x[a]+=dx[i]
How do I write something like this without a loop? Sort i1 and concoct
something that adds all the values with the same index before adding
it to x?
Thanks,
A. M. Archibald
More information about the SciPy-User
mailing list