Идея состоит в том, чтобы использовать np.ndindex следующим образом:
j = np.fromiter(np.ndindex(k.shape), dtype='i4,'*k.ndim).reshape(k.shape)
Результат:
array([[[[(0, 0, 0, 0), (0, 0, 0, 1)],
[(0, 0, 1, 0), (0, 0, 1, 1)]],
[[(0, 1, 0, 0), (0, 1, 0, 1)],
[(0, 1, 1, 0), (0, 1, 1, 1)]],
[[(0, 2, 0, 0), (0, 2, 0, 1)],
[(0, 2, 1, 0), (0, 2, 1, 1)]]],
[[[(1, 0, 0, 0), (1, 0, 0, 1)],
[(1, 0, 1, 0), (1, 0, 1, 1)]],
[[(1, 1, 0, 0), (1, 1, 0, 1)],
[(1, 1, 1, 0), (1, 1, 1, 1)]],
[[(1, 2, 0, 0), (1, 2, 0, 1)],
[(1, 2, 1, 0), (1, 2, 1, 1)]]]],
dtype=[('f0', '<i4'), ('f1', '<i4'), ('f2', '<i4'), ('f3', '<i4')])