Путаница в том, когда фрагменты массива NumPy являются ссылками и когда они являются копиями - PullRequest
0 голосов
/ 05 ноября 2018

У меня есть следующий фрагмент кода:

import numpy as np
arr = np.arange(10)
slice = arr[2:5]
slice[:] = 12
print(arr)
slice = slice / 2
print(arr)

Вывод будет:

[ 0  1 12 12 12  5  6  7  8  9]
[6. 6. 6.]
[ 0  1 12 12 12  5  6  7  8  9]

Таким образом, первый раз, когда slice - это просто ссылка на часть arr, поэтому его изменение также изменяет массив, но во второй раз он становится копией этой части массива, а его изменение не делает никаких изменений. разница в arr. Почему это происходит? Что отличает slice = slice / 2?

Ответы [ 2 ]

0 голосов
/ 05 ноября 2018

Вы должны назначить изменение всем, используя [:]

arr = np.arange(10)
slice = arr[2:5]
slice[:] = 12
print(arr)
slice[:] = slice / 2
[ 0  1 12 12 12  5  6  7  8  9]
print(arr)
[0 1 6 6 6 5 6 7 8 9]
0 голосов
/ 05 ноября 2018

Индексирование с помощью объекта-фрагмента всегда возвращает представление (ссылку) массива. Изменение среза изменит исходный массив. Во втором примере вы назначаете объект слайса. Это не меняет объект. Новый объект создается с указанными значениями, в данном случае срезом / 2. Вы можете использовать /=, чтобы изменить объект на месте, если это желаемое поведение, или индексировать срез ([:]), который numpy интерпретирует как модифицирующий записи по этим показателям.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...