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


2011/8/10 Benjamin Root <ben.r...@ou.edu>

> Came across this today when trying to determine what was wrong with my
> code:
>
> import numpy as np
> matched_to = np.array([-1] * 5)
> in_ellipse = np.array([False, True, True, True, False])
> match = np.array([False, True, True])
> matched_to[in_ellipse][match] = 3
>
> I would expect matched_to to now be "array([-1, -1, 3, 3, -1])", but
> instead, it is still all -1.
>
> It would seem that unless the view was created by a slice, then the
> assignment into the indexed view would not work as expected.  This works:
>
> >>> matched_to[:3][match] = 3
>
> but not:
>
> >>> matched_to[np.array([0, 1, 2])][match] = 3
>
> Note that the following does work:
>
> >>> matched_to[np.array([0, 1, 2])] = 3
>
> Is this a bug, or was I wrong to expect this to work this way?
>
> Thanks,
> Ben Root
>
> _______________________________________________
> NumPy-Discussion mailing list
> NumPy-Discussion@scipy.org
> http://mail.scipy.org/mailman/listinfo/numpy-discussion
>
>
_______________________________________________
NumPy-Discussion mailing list
NumPy-Discussion@scipy.org
http://mail.scipy.org/mailman/listinfo/numpy-discussion

Reply via email to