On Thu, Aug 29, 2013 at 8:04 AM, Robert Kern <robert.k...@gmail.com> wrote:
> On Thu, Aug 29, 2013 at 12:00 PM, Martin Luethi <lue...@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
_______________________________________________ NumPy-Discussion mailing list NumPy-Discussion@scipy.org http://mail.scipy.org/mailman/listinfo/numpy-discussion