[Numpy-discussion] Inplace index suprise

Gael Varoquaux gael.varoquaux@normalesup....
Thu Mar 20 12:57:46 CDT 2008


On Thu, Mar 20, 2008 at 05:42:05PM +0000, James Philbin wrote:
> I was suprised to see this result:
> >>> import numpy as N
> >>> A = N.array([0,0,0])
> >>> A[[0,1,1,2]]+=1
> >>> A
> array([1, 1, 1])

> Is this expected? Working on the principle of least surprise I would
> expect [1,2,1] to be output.

This is a FAQ. This cannot work, because the inplace operation does not
take place as a for loop. It is a "one shot" operation, that happens "at
once". Let me rephrase this: you can think of this as a two phase
operation: 

    1) first you the indices of you want to modify

	B = A[[0, 1, 1, 2]]

	thus B = array([0, 0, 0, 0)]

    2) then you add one to these:
	
	C = B + 1 = array([1, 1, 1, 1])

    3) then you assign these in the indices you are interested in:

	A[[0, 1, 1, 2]] = C

Actually, there is no copy going, so B and C do not exist as temporary
arrays, but this is the idea: the operations are happening at once over
the whole array.

HTH,

Gaël


More information about the Numpy-discussion mailing list