tengo esto:Python itertools.product reordenar la generación
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)
Hasta ahora, todo va bien, itertools.product
avanzar el elemento más a la derecha en cada iteración. Pero ahora quiero ser capaz de especificar el orden de iteración de acuerdo a lo siguiente:
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)
Si shapes
tenían tres dimensiones, axes
podría haber sido por ejemplo (0, 1, 2)
o (2, 0, 1)
etc, por lo que no es una cuestión de simple uso de reversed()
. Así que escribí un código que lo hace pero parece muy ineficiente:
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))
¿Alguna idea sobre cómo hacer esto correctamente?
para sus ejemplos 'tpaxes' es' [1, 0] 'y' axes' es '(1, 0)'. Es posible que desee cambiar los datos de ejemplo para mayor claridad, para que sean diferentes :) – hochl
Es cierto que axes = tpaxes porque esa es la única forma posible de reordenar los ejes de una matriz 2d. Para una matriz 3d, ese no es el caso. Si los ejes fueran '(2, 0, 1)', entonces tpaxes sería '(1, 2, 0)' por ejemplo. –
Lo sé, solo quería señalar que un ejemplo más complicado sería mejor en este caso; Sin ofender. – hochl