Обновление массива Numpy на месте или неявная копия

Если я добавлю массив в другой, Numpy, похоже, сделает копию исходного массива:

>>> a = np.array([2,3])
...: b = a
...: a = a+np.array([1,1])
...: print a, b
[3 4] [2 3]

Напротив, если я использую идиому +=, исходный массив кажется измененным на месте.

>>> a = np.array([2,3])
...: b = a
...: a += np.array([1,1])
...: print a, b
[3 4] [3 4]

Что здесь происходит? Когда массивы изменяются на месте и когда они автоматически копируются?


person dkv    schedule 26.12.2018    source источник
comment
В общем случае x += y не эквивалентно x = x + y. Первое определяется тем, что тип объекта определяет для __iadd__, а второе тем, что тип определяет __add__. Соглашение заключается в том, что если тип является изменяемым, __iadd__ должен работать на месте. Так, например, с объектом list += изменит список на месте, но для объектов tuple или int, которые являются неизменяемыми, будут созданы новые объекты и назначены x.   -  person juanpa.arrivillaga    schedule 26.12.2018
comment
@Juana.arrivillaga, безусловно, стоит отметить, что это справедливо для python и не зависит от numpy, где копии, возможно, придется делать неявно   -  person roganjosh    schedule 26.12.2018
comment
@roganjosh да, действительно, в моих примерах я никогда не упоминаю объекты numpy, но просто для ясности, это для любого объекта Python. А для определяемых пользователем объектов поведение __iadd__ и __add__ будет определяться пользователем, и они действительно могут делать что угодно.   -  person juanpa.arrivillaga    schedule 26.12.2018