Предположим, у меня есть массив 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.
Возможный дубликат В чем именно разница между мелкой копией, глубокой копией и обычной операцией присваивания?