numpy: значения не могут быть назначены подмассиву? - PullRequest
4 голосов
/ 01 ноября 2011
import numpy as np

a = np.zeros((3,2))
ind_row = np.array([0,1])    
a[ind_row, 1]=3

сейчас, a, как и ожидалось:

 [[ 0.  3.]
 [ 0.  3.]
 [ 0.  0.]]

Я хочу присвоить значение подмассиву a[ind_row, 1] и ожидаю, что смогу сделать это следующим образом:

a[ind_row, 1][1] = 5

Однако, это оставляет a без изменений! Почему я должен ожидать этого?

1 Ответ

10 голосов
/ 01 ноября 2011

Проблема здесь в том, что расширенное индексирование создает копию массива, и только копия модифицируется. (Это в отличие от базовой индексации, которая приводит к просмотру исходных данных.)

При прямом назначении расширенного среза

a[ind_row, 1] = 3

копия не создается, но при использовании

a[ind_row, 1][1] = 5

часть a[ind_row, 1] создает копию, а часть [1] индексирует эту временную копию. Копия действительно изменена, но, поскольку у вас нет ссылок на нее, вы не можете видеть изменения, и она сразу же собирается сборщиком мусора.

Это аналогично нарезке стандартных списков Python (которые также создают копии):

>>> a = range(5)
>>> a[2:4] = -1, -2
>>> a
[0, 1, -1, -2, 4]
>>> a[2:4][1] = -3
>>> a
[0, 1, -1, -2, 4]

Решение проблемы для этого простого случая, очевидно,

a[ind_row[1], 1] = 5

Более сложные случаи также можно переписать аналогичным образом.

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