Примером должен быть самый простой способ объяснить проблему:
a = np.array([[1, 2, 3], [4, 5, 6]])
g = np.array([[0, 0], [1, 1]])
Здесь мы можем извлечь точки (0,0) и (1,1) на «картинке» a с помощью:
print(a[g[:,0],g[:,1]])
Теперь я хочу добавить дополнительное измерение (которое можно понимать как последовательность изображений).Соответственно G теперь представляет собой последовательность списков массивов:
A = np.array([[[1, 2, 3], [4, 5, 6]], [[7, 8, 9], [10, 11, 12]]])
G = np.array([[[0, 0], [1, 1]], [[1, 0], [0, 1]]])
Теперь я хотел бы написать этот код без цикла for:
print([a[g[:,0],g[:,1]] for a, g in zip(A, G)])
Точно так же, как и раньше, должно произойти,за исключением дважды с соответственно первой и второй записями в A и G. Самое близкое, что я до сих пор сделал, это:
print(A[:,G[:,:,0],G[:,:,1]])
Что выводит это:
[[[ 1 5]
[ 4 2]]
[[ 7 11]
[10 8]]]
Вместо намеченного:
[[ 1 5]
[10 8]]
Проблема заключается в том, что в настоящее время используются комбинации отмеченных осей
print(A[:,g[:,:,0],g[:,:,1]])
^ ^ ^
Вместо этого рынок осей со стрелками необходимо каким-то образом «идентифицировать».(Подобно тому, как zip выравнивает две оси, а декартово произведение принимает все комбинации)
На самом деле заголовок не очень велик, поэтому было бы хорошо, если кто-то может предложить беттерон :).Спасибо