Изменение значений подмассива в python - PullRequest
0 голосов
/ 06 декабря 2018

Я хочу изменить значения подмассива в Python, но он не работает так, как мне бы хотелось.Вот пример, сначала давайте рассмотрим числовые массивы:

A = np.reshape(np.arange(25),(5,5))

и

B = np.ones((2,3))

Если мы проверим значения A, мы получим:

>>> A
array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14],
       [15, 16, 17, 18, 19],
       [20, 21, 22, 23, 24]])

Я хочу заменить в A значения подмассива

A[:,[1,3,4]][[1,3],:]

на значения B. Поэтому я делаю следующее:

A[:,[1,3,4]][[1,3],:] = B

и я быхотел бы получить:

>>> A
array([[ 0,  1,  2,  3,  4],
       [ 5,  1,  7,  1,  1],
       [10, 11, 12, 13, 14],
       [15,  1, 17,  1,  1],
       [20, 21, 22, 23, 24]])

Но значения A не изменяются с помощью этого метода.Конечно, я мог бы делать это поэлементно с циклами, но дело в том, что я хочу сделать это с матрицей 16000 * 16000, поэтому я ищу метод, который не использует циклы.Можете ли вы помочь мне?

Любая помощь будет оценена :) 1021 *

1 Ответ

0 голосов
/ 06 декабря 2018

Это запутанный случай.Происходит

A[:, [1,3,4]] 

индексации в A, создание нового массива, содержащего столбцы 1, 3 и 4 из A.Следующее выражение [[1, 3], :] индексирует строки этого временного массива и устанавливает его значения.

Для правильной работы необходимо проиндексировать столбцы и строки в одном выражении.Однако, если вы попытаетесь это сделать, это вызовет ошибку

A[[1,3], [1,3,4]] = B  ## Not working!

В результате numpy интерпретирует списки как пары координат, чего мы здесь не хотим (см. https://docs.scipy.org/doc/numpy/reference/arrays.indexing.htmlдля деталей. Это очень важно для чтения, если вы хотите получить максимальную отдачу от NumPy).К счастью, numpy предоставляет метод ix_ для этого случая.Он принимает списки, представляющие строки и столбцы, и создает что-то, что можно использовать в качестве индекса.

>>> A[np.ix_([1,3],[1,3,4])] = B

>>> A
array([[ 0,  1,  2,  3,  4],
       [ 5,  1,  7,  1,  1],
       [10, 11, 12, 13, 14],
       [15,  1, 17,  1,  1],
       [20, 21, 22, 23, -1]])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...