Предположим, у меня есть массив 1D numpy:
arr = np.arange(10)
Затем я нарезаю arr и присваиваю другой переменной:
arr2 = arr[5:8]
И я хочу изменить обр:
arr2 *= 10
или:
arr2 = arr2 * 10
Результаты разные. Почему они разные?
arr
массив([ 0, 1, 2, 3, 4, 50, 60, 70, 8, 9])
arr
массив([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
отсылки довольно забавные. ну попробуй сделать arr2 = arr[5:8].copy()
@AnshulVerma, с массивами numpy различие между view и copy более важно.






Проще говоря, arr2 = arr[5:8] присваивает ссылку на 5:7-й элемент arr переменной arr2.
Таким образом, операция arr2 *= 10 сводится к «умножению этих элементов на 10 на месте», что изменяет arr на месте (вы выполняете операцию на месте, модификацию, над ссылкой, которая, следовательно, влияет на оригинал).
Однако arr2 = arr2 * 10 говорит: «Возьмите результат умножения элементов 5:7 на 10, затем присвойте его переменной с именем arr2». Здесь вы выполняете операцию над ссылкой (нет модификация), берете результат (чтобы быть явным, операция arr2 * 10 возвращает новый объект) и назначаете его arr2, что случайно уничтожает исходную ссылку (но эта часть несколько не имеющий отношения).
Или сравните эти:
arr[5:8] *= 10
arr[5:8] = arr[5:8] * 10
arr2 = arr[5:8] * 10
Первые два эквивалентны. Ваш код, по сути, представляет собой сравнение первого и третьего (эквивалентно второго и третьего). Второе и третье не равны, потому что в вашем коде ваше предыдущее назначение arr2 = arr[5:8] не имеет ничего общего с LHS arr2 = arr[5:8] * 10.
In [639]: arr = np.arange(10)
При индексировании срезом (базовое индексирование) arr2 является view из arr. Он разделяет буфер данных с arr:
In [640]: arr2 = arr[5:8]
In [641]: arr2
Out[641]: array([5, 6, 7])
Если мы делаем копию, значения копируются, а не передаются:
In [642]: arr3 = arr[5:8].copy() # arr[[5,6,7]] is also a copy
Изменяя arr2 на месте, мы также изменяем часть arr:
In [643]: arr2 *= 10
In [644]: arr2
Out[644]: array([50, 60, 70])
In [645]: arr
Out[645]: array([ 0, 1, 2, 3, 4, 50, 60, 70, 8, 9])
Но не arr3:
In [646]: arr3
Out[646]: array([5, 6, 7])
arr2 = arr2*10 не изменяет массив arr2, а присваивает переменной arr2 целый новый массив.
Итак, вам нужно понять, что значит присвоить объект переменной. Разница между назначением переменной и изменением изменяемого объекта. И разница между копированием массива и просмотром (и между базовой и расширенной индексацией). Последний специфичен для numpy, остальные тоже для Python.
Возможный дубликат В чем именно разница между мелкой копией, глубокой копией и обычной операцией присваивания?