Python itertools.product переупорядочить поколение
У меня есть это:
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)
Все идет нормально,itertools.product
продвигает самый правый элемент на каждой итерации. Но теперь я хочу иметь возможность указать порядок итераций в соответствии со следующим:
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)
Еслиshapes
имел три измерения,axes
мог бы быть, например,(0, 1, 2)
или же(2, 0, 1)
и т.д., так что это не простоreversed()
, Итак, я написал некоторый код, который делает это, но кажется очень неэффективным:
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))
Есть идеи как правильно это сделать?