mam to:Python itertools.product kolejność powstawania
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)
Tak daleko, tak dobre, itertools.product
przesuwa element skrajny prawy na każdej iteracji. Ale teraz chcę, aby móc określić kolejność iteracji zgodnie z poniższym:
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)
Jeśli shapes
miał trzy wymiary, axes
mogłyby być na przykład (0, 1, 2)
lub (2, 0, 1)
etc, więc nie jest to kwestia po prostu za pomocą reversed()
. Więc napisałem jakiś kod, który robi to, ale wydaje się bardzo nieefektywne:
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))
Wszelkie pomysły, w jaki sposób prawidłowo to zrobić?
dla przykładów 'tpaxes' jest '[1, 0]' i' axes' jest '(1, 0) '. Możesz zmienić swoje przykładowe dane dla jasności, więc są różne :) – hochl
Prawda, osie = tpaxes, ponieważ jest to jedyny możliwy sposób zmiany kolejności osi matrycy 2d. W przypadku matrycy 3d tak nie jest. Jeśli osiami były '(2, 0, 1)', wtedy tpaxes byłby na przykład '(1, 2, 0)'. –
Wiem - chciałem tylko wskazać, że bardziej skomplikowany przykład byłby lepszy w tym przypadku; Bez obrazy. – hochl