2012-06-28 13 views
6

Sé cómo tomar x[:,:,:,:,j,:] (que toma la j-ésima porción de la dimensión 4).python: extracción de una porción de una matriz multidimensional dado el índice de dimensión

¿Hay alguna manera de hacer lo mismo si la dimensión se conoce en tiempo de ejecución y no es una constante conocida?

+1

La indexación con el formato 'x [algo]' es sinónimo de llamar al método '__getitem__' del objeto. Por ejemplo, su código anterior es equivalente a pasar la tupla '(slice (None), slice (None), slice (None), slice (None), j, slice (None))' to 'x .__ getitem __()' . –

+1

@JoelCornett: ¿Por qué usarías '__getitem __()' para esto? ¿Cuál es la ventaja sobre '[]'? –

+0

@SvenMarnach: No lo haría, solo sentí que OP se beneficiaría de la comprensión de este concepto. La respuesta a su pregunta es trivial, si se da cuenta de que solo se trata de pasar argumentos a una función. –

Respuesta

6

Usted puede utilizar la función slice y llamarlo con el lista de variables apropiadas durante el tiempo de ejecución de la siguiente manera:

# Store the variables that represent the slice in a list/tuple 
# Make a slice with the unzipped tuple using the slice() command 
# Use the slice on your array 

Ejemplo:

>>> from numpy import * 
>>> a = (1, 2, 3) 
>>> b = arange(27).reshape(3, 3, 3) 
>>> s = slice(*a) 
>>> b[s] 
array([[[ 9, 10, 11], 
     [12, 13, 14], 
     [15, 16, 17]]]) 

Esto es lo mismo que:

>>> b[1:2:3] 
array([[[ 9, 10, 11], 
     [12, 13, 14], 
     [15, 16, 17]]]) 

Por último, el equivalente de no especificar nada entre 2 : en la notación habitual es poner None en aquellos lugares en la tupla se crear.

8

Una opción de hacerlo es construir el corte en rodajas programáticamente:

slicing = (slice(None),) * 4 + (j,) + (slice(None),) 

Una alternativa es utilizar numpy.take() o ndarray.take():

>>> a = numpy.array([[1, 2], [3, 4]]) 
>>> a.take((1,), axis=0) 
array([[3, 4]]) 
>>> a.take((1,), axis=1) 
array([[2], 
     [4]]) 
+0

numpy.take parece lo correcto para mí para usar aquí. –

+0

¿cómo se usa 'slicing' para extraer algo de' x'? –

Cuestiones relacionadas