2012-06-28 12 views
6

So come utilizzare lo x[:,:,:,:,j,:] (che accetta la sezione jth della dimensione 4).python: estrazione di una porzione di una matrice multidimensionale data l'indice di dimensione

C'è un modo per fare la stessa cosa se la dimensione è nota al runtime e non è una costante conosciuta?

+1

L'indicizzazione nel formato 'x [qualcosa]' è sinonimo di chiamata del metodo '__getitem__' dell'oggetto. Ad esempio, il tuo codice precedente equivale a passare la tupla '(slice (None), slice (None), slice (None), slice (None), j, slice (None))' a 'x .__ getitem __()' . –

+1

@JoelCornett: Perché dovresti usare '__getitem __()' per questo? Qual è il vantaggio rispetto a '[]'? –

+0

@SvenMarnach: Non vorrei, ho solo sentito che l'OP trarrebbe beneficio dalla comprensione di questo concetto. La risposta alla sua domanda è banale, se si rende conto che è solo questione di passare argomenti a una funzione. –

risposta

6

È possibile utilizzare la funzione slice e chiamarlo con il elenco delle variabili appropriato durante il runtime nel modo seguente:

# 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 

Esempio:

>>> 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]]]) 

Questa è la stessa:

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

Infine, l'equivalente di non specificare nulla tra 2 : nella consueta notazione è di mettere None in quei luoghi nella tupla si creare.

8

Una possibilità per farlo è quello di costruire l'affettamento programatically:

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

Un'alternativa è quella di utilizzare 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 sembra la cosa giusta da usare qui. –

+0

come usi 'slicing' per estrarre qualcosa da' x'? –

Problemi correlati