Extracto numpy submatrix

Soy bastante nuevo en numpy y me cuesta entender cómo extraer de un np.array una matriz secundaria con columnas y filas definidas:

 Y = np.arange(16).reshape(4,4) 

Si quiero extraer las columnas / filas 0 y 3, debería tener:

 [[0 3] [12 15]] 

Intenté todas las funciones de remodelación … pero no sé cómo hacerlo. ¿Algunas ideas?

Prueba np.ix_

 Y[np.ix_([0,3],[0,3])] 

Esto devuelve el resultado deseado:

 In [25]: Y = np.arange(16).reshape(4,4) In [26]: Y[np.ix_([0,3],[0,3])] Out[26]: array([[ 0, 3], [12, 15]]) 

Una solución es indexar las filas / columnas por corte / zancada. Aquí hay un ejemplo donde extrae cada tercera columna / fila de la primera a la última columna (es decir, la primera y la cuarta columnas)

 In [1]: import numpy as np In [2]: Y = np.arange(16).reshape(4, 4) In [3]: Y[0:4:3, 0:4:3] Out[1]: array([[ 0, 3], [12, 15]]) 

Esto te da la salida que estabas buscando.

Para obtener más información, consulte esta página sobre la indexación en NumPy .

También puedes hacer esto usando:

 Y[[[0],[3]],[0,3]] 

que es equivalente a hacer esto usando matrices de indexación:

 idx = np.array((0,3)).reshape(2,1) Y[idx,idx.T] 

Para hacer que la transmisión funcione como se desea, necesita que la dimensión no individual de su matriz de indexación se alinee con el eje en el que está indexando, por ejemplo, para un subarreglo 2D nxm:

 Y[,<1 xm array>] 

Esto no crea una matriz intermedia, a diferencia de la respuesta de CT Zhu, que crea la matriz intermedia Y[(0,3),:] , y luego se indexa en ella.

 print y[0:4:3,0:4:3] 

Es la solución más corta y adecuada.

En primer lugar, su Y solo tiene 4 coles y filas, por lo que no hay col4 ni row4, como máximo col3 o row3.

Para obtener 0, 3 cols: Y[[0,3],:] Para obtener 0, 3 filas: Y[:,[0,3]]

Entonces para obtener la matriz que solicita: Y[[0,3],:][:,[0,3]]

Tenga en cuenta que si solo Y[[0,3],[0,3]] es equivalente a [Y[0,0], Y[3,3]] y el resultado será de dos elementos: array([ 0, 15])