2011-09-06 23 views
8

Supponiamo ho definita una matrice 3x3x3 NumPy conNumpy array multidimensionale affettare

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

Ora, posso ottenere una matrice contenente il (0,1) di ciascun elemento sottomatrice 3x3 con x[:, 0, 1], che restituisce array([ 1, 10, 19]). Cosa succede se ho una tupla (m, n) e voglio recuperare l'elemento (m, n) di ogni sottoarray (0,1) memorizzato in una tupla?

Ad esempio, supponiamo di avere t = (0, 1). Ho provato x[:, t], ma non ha il comportamento corretto - restituisce le righe 0 e 1 di ogni sottoarray. La soluzione più semplice che ho trovato è

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

ma sono sicuro che ci deve essere un modo migliore. Naturalmente, in questo caso, potrei fare x[:, t[0], t[1]], ma questo non può essere generalizzato al caso in cui non so quante dimensioni hanno x e t.

risposta

9

è possibile creare l'indice di tuple prima:

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

Cool, grazie per l'aiuto (anche tu, wim). Ho trovato altri esempi per s_ e slice su [scipy] (http://www.scipy.org/Numpy_Example_List). Penso di averlo esaminato in precedenza, ma non ho visto nulla di rilevante. – James

4

soluzione HYRY è corretto, ma ho sempre trovato r_, c_ e s_ trucchi indice di NumPy ad essere un po 'strano alla ricerca. Così qui è la cosa equivalente utilizzando un oggetto slice:

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

Questo singolo argomento per tagliare è la posizione di arresto (cioè None cioè tutti nello stesso modo in cui x[:] è equivalente a x[None:None])