нарезка и индексирование разных результатов - PullRequest
0 голосов
/ 07 мая 2018

В крошечных подмассивах, полученных с помощью любой из операций нарезки, маскирования или необычного индексирования, это просто представления исходного массива, которые можно продемонстрировать следующим образом:

$ python3
Python 3.5.2 (default, Nov 23 2017, 16:37:01) 
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import numpy as np
>>> np.__version__
'1.11.0'

>>> a = np.arange(3); a[:2] = 111; a
array([111, 111,   2])

>>> a = np.arange(3); a[a<2] = 111; a
array([111, 111,   2])

>>> a = np.arange(3); a[[0,1]] = 111; a
array([111, 111,   2])

В приведенном выше примере весь подмассив был назначен. Однако если мы присваиваем элементу подмассива, результат операции среза все еще ведет себя как представление, тогда как результаты операций маскирования и необычного индексирования ведут себя как независимые копии:

>>> a = np.arange(3); a[:2][0] = 111; a
array([111,   1,   2])

>>> a = np.arange(3); a[a<2][0] = 111; a
array([0, 1, 2])

>>> a = np.arange(3); a[[0,1]][0] = 111; a
array([0, 1, 2])

Это ошибка в NumPy, или это задумано? Если это так, то каково обоснование такой несоответствия?

1 Ответ

0 голосов
/ 07 мая 2018

Это не ошибка. Поскольку вы передаете объект среза в массив Numpy, возвращенный подмассив является представлением исходных элементов, что означает, что даже назначение срезов или отдельных элементов изменит исходный массив. Но в других случаях возвращаемый результат не является просмотром. Фактически это мелкий вид (копия) выбранного среза, который поддерживает только назначение срезов, как и другие изменяемые объекты в Python.

Это также упоминается в документации :

[...] Как и в случае с индексными массивами, возвращается копия данных, а не представление, полученное с помощью срезов.

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