[Numpy-discussion] Array addition inconsistency

Benjamin Root ben.root@ou....
Thu Aug 29 08:39:06 CDT 2013


On Thu, Aug 29, 2013 at 8:04 AM, Robert Kern <robert.kern@gmail.com> wrote:

> On Thu, Aug 29, 2013 at 12:00 PM, Martin Luethi <luethi@vaw.baug.ethz.ch>
> wrote:
> >
> > Dear all,
> >
> > After some surprise, I noticed an inconsistency while adding array
> > slices:
> >
> > > a = np.arange(5)
> > > a[1:] = a[1:] + a[:-1]
> > > a
> > array([0, 1, 3, 5, 7])
> >
> > versus inplace
> >
> > > a = np.arange(5)
> > > a[1:] += a[:-1]
> > > a
> > array([ 0,  1,  3,  6, 10])
> >
> > My suspicition is that the second variant does not create intermediate
> > storage, and thus works on the intermediate result, effectively
> > performing a.cumsum().
>
> Correct. Not creating intermediate storage is the point of using augmented
> assignment.
>
>
This can be very sneaky.

> a = np.arange(5)
> a[:-1] = a[:-1] + a[1:]
> a
array([1, 3, 5, 7, 4])

> a = np.arange(5)
> a[:-1] += a[1:]
> a
array([1, 3, 5, 7, 4])

So, if someone is semi-careful and tries out that example, they might
(incorrectly) assume that such operations are safe without realizing that
it was safe because the values of a[1:] were ahead of the values of a[:-1]
in memory. I could easily imagine a situation where views of an array are
passed around only to finally end up in an in-place operation like this and
sometimes be right and sometimes be wrong. Maybe there can be some simple
check that could be performed to detect this sort of situation?

Cheers!
Ben Root
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://mail.scipy.org/pipermail/numpy-discussion/attachments/20130829/2642021f/attachment.html 


More information about the NumPy-Discussion mailing list