2011/8/11 Benjamin Root <ben.root@ou.edu>
>>> On Thu, Aug 11, 2011 at 8:37 AM, Olivier Delalleau <shish@keba.be> wrote:
>>> Maybe confusing, but working as expected.
>>>>>> When you write:
>> matched_to[np.array([0, 1, 2])] = 3
>> it calls __setitem__ on matched_to, with arguments (np.array([0, 1, 2]),
>> 3). So numpy understand you want to write 3 at these indices.
>>>>>> When you write:
>> matched_to[:3][match] = 3
>> it first calls __getitem__ with the slice as argument, which returns a
>> view of your array, then it calls __setitem__ on this view, and it fills
>> your matched_to array at the same time.
>>>>>> But when you write:
>> matched_to[np.array([0, 1, 2])][match] = 3
>> it first calls __getitem__ with the array as argument, which retunrs a
>> *copy* of your array, so that calling __setitem__ on this copy has no effect
>> on your original array.
>>>> -=- Olivier
>>>>> Right, but I guess my question is does it *have* to be that way? I guess
> it makes some sense with respect to indexing with a numpy array like I did
> with the last example, because an element could be referred to multiple
> times (which explains the common surprise with '+='), but with boolean
> indexing, we are guaranteed that each element of the view will appear at
> most once. Therefore, shouldn't boolean indexing always return a view, not
> a copy? Is the general case of arbitrary array selection inherently
> impossible to encode in a view versus a slice with a regular spacing?
>
Yes, due to the fact the array interface only supports regular spacing
(otherwise it is more difficult to get efficient access to arbitrary array
positions).
-=- Olivier
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://mail.scipy.org/pipermail/numpy-discussion/attachments/20110811/231d3f49/attachment.html