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)

Если бы формыимели три измерения, осимогли бы быть, например, (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))

Любые идеи о том, как правильно это сделать?

9
задан Giovanni Funchal 28 March 2012 в 08:16
поделиться