Numpy Advanced Indexing и базовая индексация - PullRequest
0 голосов
/ 31 августа 2018

Я пытаюсь понять конкретную часть этой статьи .

Определение расширенной индексации означает, что x[(1,2,3),] принципиально отличается от x[(1,2,3)]. Последний эквивалентен x[1,2,3], который вызовет базовый выбор, тогда как первый вызовет расширенную индексацию. Обязательно поймите, почему это происходит.

Я экспериментировал со следующим кодом.

>>> import numpy as np 
>>> a = np.arange(50).reshape(5,10)    
>>> b = a[(2,2)]    
>>> bb = a[(2,2),]    
>>> a[2,2] = 50 # a[2,2] was 22 in the first place 
>>> b
22  # this outcome confuses me!

Я думаю, b = a[(2,2)] получит представление, поэтому, когда я изменю a[2,2], это будет сделано.

bb = a[(2,2),] получит копию, так что ничего не произойдет, даже если я что-то сделаю на.

Но когда я меняю a[2,2] с 22 на 50

То, что я ожидаю, b = a[(2,2)] изменится на 50 а, а bb = a[(2,2),] останется прежним.

Что не так со всем этим? Я неправильно понимаю или упускаю что-то важное?

Если да, поправьте меня и заранее поблагодарите!

1 Ответ

0 голосов
/ 31 августа 2018

«Базовый выбор» (т. Е. Индексирование, а не нарезка) не создает представление, оно создает копию. Чтобы быть представлением, вам нужно передать одноэлементный срез (в отличие от индексации срезы всегда являются представлениями).

import numpy as np 
a = np.arange(50).reshape(5,10)    
b = a[2:3,2:3].squeeze()    
a[2,2] = 50 
b

array(50)

Вы также можете получить то же самое с b = a[2, 2, None].squeeze(), который запускает "необычную" индексацию ", которая является своего рода гибридом между выбором и секцией и возвращает представление. Используя" расширенную "индексацию (как вы это сделали, или как b = a[[2],[2]]) является вариантом индексации и возвращает копию.

И да, держать эти различные типы индексации в прямом смысле непросто для начинающих. И создание представления одного элемента все еще немного хакерски. Массив 0-dim, такой как array(50), может использоваться в большинстве случаев как обычный int.

Чтобы сделать это еще более запутанным, a[2,2] интерпретируется как представление, когда слева от знака равенства, но не справа. Это связано с тем, что = интерпретируется как .__setitem__().

...