On Mon, Jan 18, 2010 at 13:41, Russel Howe <[email protected]> wrote:
> This looks like the difference between memmove and memcpy to me, but I
> am not sure what the expected behavior of numpy should be.  The first
> shift behaves the way I expect, the second is surprising.

memmove() and memcpy() are not used for these operations (and in
general, they can't be). Rather, iterators are created and looped over
to do the assignments. Because you are not making copies on the
right-hand-side, you are modifying the RHS as the iterators assign to
the LHS.

> In [3]: a[:, :-1] = a[:, 1:]
>
> In [4]: a
> Out[4]:
> array([[0, 5, 4, 8, 2, 7, 8, 7, 6, 6],
>        [6, 3, 3, 9, 8, 0, 8, 9, 5, 5],
>        [0, 1, 1, 2, 5, 8, 2, 5, 3, 3],
>        [0, 0, 2, 8, 2, 0, 7, 7, 0, 0],
>        [8, 6, 9, 6, 3, 9, 4, 4, 5, 5],
>        [7, 6, 9, 3, 8, 9, 9, 6, 9, 9],
>        [8, 8, 4, 0, 3, 7, 6, 7, 6, 6],
>        [4, 9, 2, 4, 7, 3, 6, 7, 4, 4],
>        [2, 0, 7, 0, 7, 6, 6, 1, 6, 6],
>        [3, 8, 8, 9, 6, 7, 2, 5, 0, 0]], dtype=uint8)

The first one works because the RHS pointer is always one step ahead
of the LHS pointer, thus it always reads pristine data.

> In [5]: a[:, 1:] = a[:, :-1]
>
> In [6]: a
> Out[6]:
> array([[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
>        [6, 6, 6, 6, 6, 6, 6, 6, 6, 6],
>        [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
>        [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
>        [8, 8, 8, 8, 8, 8, 8, 8, 8, 8],
>        [7, 7, 7, 7, 7, 7, 7, 7, 7, 7],
>        [8, 8, 8, 8, 8, 8, 8, 8, 8, 8],
>        [4, 4, 4, 4, 4, 4, 4, 4, 4, 4],
>        [2, 2, 2, 2, 2, 2, 2, 2, 2, 2],
>        [3, 3, 3, 3, 3, 3, 3, 3, 3, 3]], dtype=uint8)

The second one fails to work as you expect because the RHS pointer is
always one step behind the LHS pointer, thus it always reads the data
that just got modified in the previous step. The data you expected it
to read has already been wiped out.

-- 
Robert Kern

"I have come to believe that the whole world is an enigma, a harmless
enigma that is made terrible by our own mad attempt to interpret it as
though it had an underlying truth."
  -- Umberto Eco
_______________________________________________
NumPy-Discussion mailing list
[email protected]
http://mail.scipy.org/mailman/listinfo/numpy-discussion

Reply via email to