2011-09-06 38 views
8

Supongamos que tengo definido una matriz 3x3x3 numpy conNumpy matriz multidimensional rebanar

x = numpy.arange(27).reshape((3, 3, 3)) 

Ahora, puedo obtener una matriz que contiene el elemento (0,1) de cada submatriz 3x3 con x[:, 0, 1], que devuelve array([ 1, 10, 19]). ¿Qué pasa si tengo una tupla (m, n) y quiero recuperar el elemento (m, n) de cada subcampo (0,1) almacenado en una tupla?

Por ejemplo, supongamos que tengo t = (0, 1). Intenté x[:, t], pero no tiene el comportamiento correcto: devuelve las filas 0 y 1 de cada subcampo. La solución más simple que he encontrado es

x.transpose()[tuple(reversed(t))].transpose() 

pero estoy seguro de que debe haber una manera mejor. Por supuesto, en este caso, podría hacer x[:, t[0], t[1]], pero eso no se puede generalizar al caso en el que no sé cuántas dimensiones tienen x y t.

Respuesta

9

puede crear el índice de tupla primero:

index = (numpy.s_[:],)+t 
x[index] 
+0

Cool, gracias por la ayuda (tú también, wim). Encontré más ejemplos para s_ y slice en [scipy] (http://www.scipy.org/Numpy_Example_List). Creo que miré esa lista antes, pero no vi nada que pareciera relevante. – James

4

solución Hyry es correcta, pero siempre he encontrado r_, c_ y s_ trucos índice de numpy a ser un poco extraño aspecto. Así que aquí es lo equivalente utilizando un objeto slice:

x[(slice(None),) + t] 

Eso solo argumento para rebanar es la posición de parada (es decir None es decir, todos de la misma manera que x[:] es equivalente a x[None:None])

Cuestiones relacionadas