Eu quero cortar uma matriz NumPy nxn. Eu quero extrair uma seleção arbitrária de m linhas e colunas dessa matriz (ou seja, sem nenhum padrão no número de linhas / colunas), tornando-a uma nova matriz mxm. Neste exemplo, digamos que a matriz é 4x4 e quero extrair uma matriz 2x2 dela.
Aqui está a nossa matriz:
from numpy import *
x = range(16)
x = reshape(x,(4,4))
print x
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]
[12 13 14 15]]
A linha e as colunas a serem removidas são as mesmas. O caso mais fácil é quando eu quero extrair uma submatriz 2x2 que está no começo ou no fim, ou seja:
In [33]: x[0:2,0:2]
Out[33]:
array([[0, 1],
[4, 5]])
In [34]: x[2:,2:]
Out[34]:
array([[10, 11],
[14, 15]])
Mas e se eu precisar remover outra mistura de linhas / colunas? E se eu precisar remover a primeira e a terceira linha / linha, extraindo a submatriz [[5,7],[13,15]]
? Pode haver qualquer composição de linhas / linhas. Eu li em algum lugar que eu só preciso indexar minha matriz usando matrizes / listas de índices para linhas e colunas, mas isso não parece funcionar:
In [35]: x[[1,3],[1,3]]
Out[35]: array([ 5, 15])
Eu encontrei uma maneira, que é:
In [61]: x[[1,3]][:,[1,3]]
Out[61]:
array([[ 5, 7],
[13, 15]])
A primeira questão é que é dificilmente legível, embora eu possa viver com isso. Se alguém tiver uma solução melhor, eu certamente gostaria de ouvi-la.
Outra coisa é que li em um fórum que a indexação de matrizes com matrizes força o NumPy a fazer uma cópia da matriz desejada, portanto, ao tratar com matrizes grandes, isso pode se tornar um problema. Por que é assim / como esse mecanismo funciona?