2015-05-14 3 views
7

Mi chiedo se è possibile memorizzare la notazione numerica delle sezioni in un dizionario python. Qualcosa di simile:Notazione delle porzioni NumPy in un dizionario

lookup = {0:[:540], 
      30:[540:1080], 
      60:[1080:]} 

È possibile utilizzare la sintassi della sezione Python nativa, ad es. slice(0,10,2), ma non sono stato in grado di memorizzare fette più complesse. Ad esempio, qualcosa che è multidimensionale [:,:2,:, :540].

Il mio attuale lavoro è quello di memorizzare i valori come tuple e quindi scompattarli nelle sezioni necessarie.

Lavorare in Python 2.x.

+0

Mi propongo di riformulare la domanda per concentrarsi esclusivamente su come memorizzare un'espressione di sezione. +1 in entrambi i modi – PascalVKooten

+1

Puoi usare una tupla di 'slice' per farlo funzionare con più dimensioni – RafaelC

+1

Puoi usare lambdas e passare l'array –

risposta

9

La sintassi [:, :2, :, :540] è trasformato in una tupla di slice oggetti Python:

(slice(None, None, None), 
slice(None, 2, None), 
slice(None, None, None), 
slice(None, 540, None)) 

Un modo conveniente per generare questo tupla è quello di utilizzare la funzione speciale * np.s_. Hai solo bisogno di passarlo l'espressione [...]. Per esempio:

>>> np.s_[:540] 
slice(None, 540, None) 
>>> np.s_[:, :2, :, :540] 
(slice(None, None, None), 
slice(None, 2, None), 
slice(None, None, None), 
slice(None, 540, None)) 

Poi il dizionario di fette potrebbe essere scritto come:

lookup = {0: np.s_[:540], 
      30: np.s_[540:1080], 
      60: np.s_[1080:]} 

* tecnicamente s_ è un alias per la classe IndexExpression che implementa uno speciale metodo di __getitem__.

+0

Non sapevo di' np.s_', assolutamente fantastico in quanto consente una maggiore leggibilità per qualcuno che non si sente a proprio agio con la notazione di slice in puro pitone. – Jzl5325

+0

Stavo per suggerire di scrivere una classe personalizzata con un semplice 'def __getitem __ (self, item): return item', ma suppongo che sia fondamentalmente ciò che' s_' fa. Non sapevo di quello! –

2

Numpy ha un sacco di Indexing routines .And in questo caso è possibile utilizzare le seguenti funzioni per la generazione di array index:

c_: Traduce oggetti porzione di concatenazione lungo il secondo asse.

r_: traduce gli oggetti di sezione in concatenazione lungo il primo asse.

s_: Un modo più semplice per creare tuple di indice per gli array.

È possibile anche utilizzare numpy.unravel_index:

Converte una tupla di array indice in un array di indici piatte, applicando modalità contorno alla multiindice.