Индексация 3dArray с 2dArray из 2d Индексы, где индексы соответствуют последним 2 измерениям и определены первые оси

Примером должен быть самый простой способ объяснить проблему:

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 выравнивает две оси, а декартово произведение принимает все комбинации)

Название на самом деле не очень хорошее, поэтому было бы хорошо, если бы кто-то мог предложить бетоне:). Спасибо

0 ответов

Другие вопросы по тегам