Eu tenho uma matriz numpy 2D muito grande (A) e uma matriz 2D menor (B) que é menor em ambas as dimensões. B é quadrado. Eu tenho uma matriz de índice com o mesmo comprimento de B. Assim:
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, 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, 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, 4, 5, 7],
[2, 7, 1, 3],
[6, 1, 3, 5],
[1, 6, 3, 2]])
Index = np.array([0, 1, 5, 6])
Desejo adicionar o conteúdo de B a A nas linhas e colunas definidas por Index. A não está necessariamente cheio de 0s, então precisa ser adicionado. O resultado ficaria assim:
R = np.array([2, 4, 0, 0, 0, 5, 7, 0, 0],
[2, 7, 0, 0, 0, 1, 3, 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],
[6, 1, 0, 0, 0, 3, 5, 0, 0],
[1, 6, 0, 0, 0, 3, 2, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0]])
Já tentei fazer com isso:
A[Index, Index] += B
O que me dá o seguinte erroValueError: shape mismatch: value array of shape (4,4) could not be broadcast to indexing result of shape (4,)
Não entendo por que isso não funciona, porque posso fazer isso:
A[Index, Index[0]:Index[0]+4] = B
E todos os valores aparecerão nas linhas corretas, mas não nas colunas corretas. O que faz sentido, porque estou apenas dando a ele um bloco de 4 colunas para que apareça, mas gostaria que aparecesse nas colunas definidas por Index.
Eu também tentei np.add.at(A[Index], Index, B) o que me dá IndexError: index 6 is out of bounds for axis 0 with size 4.
Acho que não entendi porque está tentando acessar o índice 6 em B, que tem tamanho 4.
A indexação com arrays usa
broadcasting
. Usando 2 (4,) arrays como índices, produz o resultado da forma s (4,):ix_
faz uma matriz (4,1) e (1,4). Aqueles transmitidos juntos para indexar uma forma (4,4):que corresponde ao seu
B
:Há uma grande página de indexação numpy, e esses tipos de detalhes são tratados na
advanced indexing
seção.Você pode tentar usar
np.repeat()
para repetir o índice no eixo da linha enp.tile()
para repetir o índice no eixo da coluna.Isso fornece um índice com o seguinte padrão:
Então, você pode indexar em A com isso.
(
B.flatten()
é necessário porque a forma no lado esquerdo também é achatada.)Resultado: