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))

Есть идеи как правильно это сделать?

Ответы на вопрос(6)

Ваш ответ на вопрос