Вы можете использовать itertools
для этого.
следующий фрагмент кода сгенерирует индексы, к которым вы сможете обращаться к массиву при их получении:
import numpy as np
import itertools
v1 = np.random.randint(5, size=2)
v2 = np.random.randint(5, size=(2, 4))
v3 = np.random.randint(5, size=(2, 3, 2))
# v1
args1 = [list(range(e)) for e in list(v1.shape)]
print(v1)
for combination in itertools.product(*args1):
print(v1[combination])
# v2
args2 = [list(range(e)) for e in list(v2.shape)]
print(v2)
for combination in itertools.product(*args2):
print(v2[combination])
# v3
args3 = [list(range(e)) for e in list(v3.shape)]
print(v3)
for combination in itertools.product(*args3):
print(v3[combination])
Протестировано на простых массивах разных размеров и отлично работает.