[Numpy-discussion] Array addition inconsistency

Benjamin Root ben.root at ou.edu
Thu Aug 29 09:39:06 EDT 2013


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

> On Thu, Aug 29, 2013 at 12:00 PM, Martin Luethi <luethi at 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.python.org/pipermail/numpy-discussion/attachments/20130829/2642021f/attachment.html>


More information about the NumPy-Discussion mailing list