У меня есть это:
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))
Любые идеи о том, как правильно это сделать?