ho questo:Python itertools.product riordinare la generazione
shape = (2, 4) # arbitrary, could be 3 dimensions such as (3, 5, 7), etc...
for i in itertools.product(*(range(x) for x in shape)):
print(i)
# output: (0, 0) (0, 1) (0, 2) (0, 3) (1, 0) (1, 1) (1, 2) (1, 3)
Fin qui, tutto bene, itertools.product
avanza l'elemento più a destra su ogni iterazione. Ma ora voglio essere in grado di specificare l'ordine di iterazione secondo il seguente:
axes = (0, 1) # normal order
# output: (0, 0) (0, 1) (0, 2) (0, 3) (1, 0) (1, 1) (1, 2) (1, 3)
axes = (1, 0) # reversed order
# output: (0, 0) (1, 0) (2, 0) (3, 0) (0, 1) (1, 1) (2, 1) (3, 1)
Se shapes
aveva tre dimensioni, axes
avrebbe potuto essere per esempio (0, 1, 2)
o (2, 0, 1)
ecc, quindi non è una questione di semplicemente utilizzando reversed()
. Così ho scritto un codice che lo fa, ma sembra molto inefficiente:
axes = (1, 0)
# transposed axes
tpaxes = [0]*len(axes)
for i in range(len(axes)):
tpaxes[axes[i]] = i
for i in itertools.product(*(range(x) for x in shape)):
# reorder the output of itertools.product
x = (i[y] for y in tpaxes)
print(tuple(x))
Tutte le idee su come fare correttamente questo?
per i vostri esempi '' tpaxes' è [1, 0] 'e' axes' è '(1, 0)'. Potresti voler cambiare i dati di esempio per maggiore chiarezza in modo che siano diversi :) – hochl
Vero, assi = tpax perché questo è l'unico modo possibile per riordinare gli assi di una matrice 2d. Per una matrice 3d, non è così. Se gli assi fossero '(2, 0, 1)' allora tpaxes sarebbe '(1, 2, 0)' per esempio. –
Lo so - volevo solo sottolineare che un esempio più complicato sarebbe meglio in questo caso; Senza offesa. – hochl