Как я могу добавить маленькую матрицу в большую с NumPy? - PullRequest
0 голосов
/ 02 ноября 2018

Я пытаюсь выяснить, как взять небольшую матрицу (матрица B ниже) и добавить значения в большую матрицу (матрица A ниже) по определенному индексу. Кажется, что numpy будет хорошим вариантом для этого сценария, но я не могу понять, как это сделать.

Матрица A:

[[0, 0, 0, 0, 0, 0]
 [0, 0, 0, 0, 0, 0]
 [0, 0, 0, 0, 0, 0]
 [0, 0, 0, 0, 0, 0]
 [0, 0, 0, 0, 0, 0]]

Матрица B:

[[2, 3, 4]
 [5, 6, 7]
 [8, 9, 3]]

Желаемый конечный результат:

[[0, 0, 0, 0, 0, 0]
 [0, 0, 2, 3, 4, 0]
 [0, 0, 5, 6, 7, 0]
 [0, 0, 8, 9, 3, 0]
 [0, 0, 0, 0, 0, 0]]

Ответы [ 2 ]

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

Вы можете добавить массив b в ту же форму с помощью a. numpy.pad

import numpy as np

a = np.array([[0,0,0,0,0,0],
 [0,0,0,0,0,0],
 [0,0,0,0,0,0],
 [0,0,0,0,0,0],
 [0,0,0,0,0,0]])

b = np.array([[2,3,4],
 [5,6,7],
 [8,9,3]])


b = np.pad(b, ((1,1) , (2,1)), mode = 'constant', constant_values=(0, 0))

print(a+b)

После заполнения b будет

[[0 0 0 0 0 0]
 [0 0 2 3 4 0]
 [0 0 5 6 7 0]
 [0 0 8 9 3 0]
 [0 0 0 0 0 0]]

a + b будет

[[0 0 0 0 0 0]
 [0 0 2 3 4 0]
 [0 0 5 6 7 0]
 [0 0 8 9 3 0]
 [0 0 0 0 0 0]]

((1,1) , (2,1)) означает, что вы добавляете 1 строку сверху, одну строку снизу, 2 столбца слева, 1 столбец справа. Все добавленные строки и столбцы являются нулями из-за mode = 'constant', constant_values=(0, 0).

Таким образом, вы можете ввести индекс, который вы хотите добавить матрицу

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

Если вы хотите добавить B к A с верхним левым углом B, идущим к индексу (r, c) в A, вы можете сделать это, используя индекс и атрибут shape из B:

A[r:r+B.shape[0], c:c+B.shape[1]] += B

Если вы хотите просто установить элементы (перезаписать вместо добавления), замените += на =. В вашем конкретном примере:

>>> A = np.zeros((5, 6), dtype=int)
>>> B = np.r_[np.arange(2, 10), 3].reshape(3, 3)

>>> r, c = 1, 2

>>> A[r:r+B.shape[0], c:c+B.shape[1]] += B
>>> A
array([[0, 0, 0, 0, 0, 0],
       [0, 0, 2, 3, 4, 0],
       [0, 0, 5, 6, 7, 0],
       [0, 0, 8, 9, 3, 0],
       [0, 0, 0, 0, 0, 0]])

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

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