Использование transpose
для перемещения оси итерации в известную позицию, переднюю или последнюю, выполняется в некоторых numpy
функциях.
Другой подход заключается в создании объекта slice
и итерации этого,
In [46]: arr = np.zeros((2,3,4),int)
In [47]: idx = np.full((arr.ndim,), slice(None))
In [48]: n=2
In [49]: for i in range(arr.shape[n]):
...: idx[n] = i
...: arr[tuple(idx)] = i+1
...:
In [50]: arr
Out[50]:
array([[[1, 2, 3, 4],
[1, 2, 3, 4],
[1, 2, 3, 4]],
[[1, 2, 3, 4],
[1, 2, 3, 4],
[1, 2, 3, 4]]])
для другой оси
In [56]: arr = np.zeros((2,3,4),int)
In [57]: idx = np.full((arr.ndim,), slice(None))
In [58]: n=1
In [59]: for i in range(arr.shape[n]):
...: idx[n] = i
...: arr[tuple(idx)] = i+1
...:
In [60]: arr
Out[60]:
array([[[1, 1, 1, 1],
[2, 2, 2, 2],
[3, 3, 3, 3]],
[[1, 1, 1, 1],
[2, 2, 2, 2],
[3, 3, 3, 3]]])
В этом случае idx
изменяется следующим образом:
[slice(None, None, None) 0 slice(None, None, None)]
[slice(None, None, None) 1 slice(None, None, None)]
[slice(None, None, None) 2 slice(None, None, None)]
Ключ в том, что индексное выражение имеет кортежный эквивалент, который может быть построен программно:
In [61]: np.s_[:,3,:]
Out[61]: (slice(None, None, None), 3, slice(None, None, None))