Вот неизбежный вкладыш.
>>> np.concatenate([np.moveaxis(np.indices(mag_2D.shape[:-1]), 0, -1)[..., ::-1], mag_2D], -1)
array([[[ 0, 0, 10, 11],
[ 1, 0, 12, 13],
[ 2, 0, 14, 15]],
[[ 0, 1, 16, 17],
[ 1, 1, 18, 19],
[ 2, 1, 20, 21]]])
Самый простой способ понять это - разобрать его:
np.indices
создает индексы из формы
>>> np.indices(mag_2D.shape[:-1])
array([[[0, 0, 0],
[1, 1, 1]],
[[0, 1, 2],
[0, 1, 2]]])
Это, однако, отдельные для каждого измерения.Чтобы получить координаты "кортежей", мы должны переместить ведущую ось в конец:
>>> np.moveaxis(np.indices(mag_2D.shape[:-1]), 0, -1)
array([[[0, 0],
[0, 1],
[0, 2]],
[[1, 0],
[1, 1],
[1, 2]]])
Это y, x
, OP хочет x, y
>>> np.moveaxis(np.indices(mag_2D.shape[:-1]), 0, -1)[..., ::-1]
array([[[0, 0],
[1, 0],
[2, 0]],
[[0, 1],
[1, 1],
[2, 1]]])