Quiero cortar una matriz NumPy nxn. Quiero extraer una selección arbitraria de m filas y columnas de esa matriz (es decir, sin ningún patrón en el número de filas / columnas), convirtiéndola en una nueva matriz mxm. Para este ejemplo, digamos que la matriz es 4x4 y quiero extraer una matriz de 2x2.
Aquí está nuestra 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]]
La línea y las columnas para eliminar son las mismas. El caso más fácil es cuando quiero extraer una submatriz de 2x2 que está al principio o al final, es decir:
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]])
Pero, ¿qué sucede si necesito eliminar otra mezcla de filas / columnas? ¿Qué sucede si necesito eliminar la primera y tercera línea / fila, extrayendo así la submatriz [[5,7],[13,15]]
? Puede haber cualquier composición de filas / líneas. Leí en alguna parte que solo necesito indexar mi matriz usando matrices / listas de índices tanto para filas como para columnas, pero eso no parece funcionar:
In [35]: x[[1,3],[1,3]]
Out[35]: array([ 5, 15])
Encontré una forma, que es:
In [61]: x[[1,3]][:,[1,3]]
Out[61]:
array([[ 5, 7],
[13, 15]])
El primer problema con esto es que apenas es legible, aunque puedo vivir con eso. Si alguien tiene una mejor solución, ciertamente me gustaría escucharla.
Otra cosa es que leí en un foro que indexar matrices con matrices obliga a NumPy a hacer una copia de la matriz deseada, por lo tanto, cuando se trata con matrices grandes, esto podría convertirse en un problema. ¿Por qué es así / cómo funciona este mecanismo?