Gli indici di una sezione slice(start, stop[, step])
possono essere spesso rappresentati da range(start, stop, step)
(o range(*slice(start, stop, step).indices(length))
quando si prendono in considerazione le dimensioni sottostanti).Sezione che rappresenta le fette concatenate
Diciamo che ho anche due fette multidimensionali e la seconda fetta potrebbe essere usata come una fetta nel risultato dell'applicazione della prima fetta.
Esempio:
import numpy as np
data = np.random.rand(*(100, 100, 100))
a = data[::2, 7, :] # slice 1, a.shape = (50,100)
b = a[1, ::-1] # slice 2, b.shape = (100,)
mi piacerebbe trovare un'espressione generale per il calcolo della sola fetta che fa lo stesso lavoro. Conosco le dimensioni della struttura dati sottostante.
c = data[2, 7, ::-1] # same as b
np.array_equal(b, c) # True
Così, a ottenere dal [::2, 7, :]
e [1, ::-1]
-[2, 7, ::-1]
in questo esempio avrei bisogno di una funzione come:
def concatenate_slices(shape, outer_slice, inner_slice):
...
return combined_slice
dove outer_slice
e inner_slice
sarebbero entrambi una tupla di fette. Nell'esempio shape=(100, 100, 100)
e outer_slice=(slice(None, None, 2), 7, slice(None, None, None))
e inner_slice=(1, slice(None, None, -1))
.
Non sono sicuro di come farlo in modo efficiente.
I miei oggetti fanno qualcosa quando si chiama __getitem__(slice)
(nessuna vista intermedia) e voglio farlo una sola volta ma ho ancora la possibilità di avere fette di fette.
Come estensione (facoltativo) vorrei sapere cosa succede se ho delle ellissi nelle sezioni. Come posso quindi creare la combinazione?
solo per riferimento: 'range (start, stop, step)' non produce sempre gli indici corretti in quanto può anche produrre indici fuori intervallo, per creare un intervallo valido ['slice.indices()'] (https://docs.python.org/3/reference/datamodel.html?highlight=slice.indices#slice.indices) deve essere usato: 'range (* slice (start, stop, step) .indices (length)) '. Non sono sicuro se sia possibile combinare le sezioni senza prendere in considerazione la forma della struttura sottostante. – mata
@mata Grazie. Hai ragione. Anche nel mio caso vorrei conoscere la forma della struttura sottostante. Ho modificato un po '. – Trilarion
Immagino che si possa fare manualmente mettendo insieme una nuova fetta guardando i limiti dei primi due. Ho iniziato a scriverlo ma è troppo disordinato per i miei gusti, dovrebbe esserci un modo migliore (quindi ho rinunciato). –