On Thu, Aug 11, 2011 at 8:37 AM, Olivier Delalleau <sh...@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?

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

Reply via email to