Numpy - Различное поведение для 1-го и 2-го массивов - PullRequest
0 голосов
/ 26 ноября 2018

Я просматривал какой-то непонятный код и столкнулся с этой проблемой.Numpy демонстрирует различное поведение для 1-го массива и 2-го массива.В первом случае создается ссылка, а во втором - глубокая копия.

Вот фрагмент кода

import numpy as np

# Case 1: when using 1d-array

arr = np.array([1,2,3,4,5])
slice_arr = arr[:3]  # taking first three elements, behaving like reference

slice_arr[2] = 100 # modifying the value

print(slice_arr)
print (arr) # here also value gets changed

# Case 2: when using 2d-array

arr = np.array([[1,2,3],[4,5,6],[7,8,9]])
slice_arr = arr[:,[0,1]]  # taking all rows and first two columns, behaving like deep copy

slice_arr[0,1] = 100 # modifying the value

print(slice_arr)
print() # newline for clarity
print (arr) # here value doesn't change

Кто-нибудь может объяснить причину такого поведения?

1 Ответ

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

Причина в том, что вы выполняете нарезку не одинаково, это не 1D против 2D.

slice_arr = arr[:3]

Здесь вы используете оператор нарезки, поэтому numpy может просматривать ваши исходные данные.и возвращает его.

slice_arr = arr[:,[0,1]]

Здесь вы используете список элементов, которые вы хотите, и это не срез (даже если он может быть представлен срезом), в этом случае numpy возвращает копию.

Все они являются геттерами, поэтому они могут возвращать либо представление, либо копирование.

Для сеттеров он всегда изменяет текущий массив.

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