Итак, подсказки уже есть в полезных комментариях, но для полноты информации это так же просто, как использовать np.take_along_axis и транслируемую версию массива 2d:
psh = np.array(
[[[1,2,3]],
[[3,2,1]]]
)
ph_idx = np.array(
[[0,1,2],
[2,1,0]]
)
np.take_along_axis(psh, ph_idx[:, None, :], axis=2)
Это имеет преимуществотакже работает, если массив 3d имеет dim1 из более чем одного элемента:
psh = np.array(
[[[1,2,3],[4,5,6],[7,8,9]],
[[3,2,1],[6,5,4],[9,8,7]]]
)
ph_idx = np.array([[0,1,2], [2,1,0]])
np.take_along_axis(psh, ph_idx[:, None, :], axis=2)
, что дает
array([[[1, 2, 3],
[4, 5, 6],
[7, 8, 9]],
[[1, 2, 3],
[4, 5, 6],
[7, 8, 9]]])