Индексация 3dArray с 2dArray из 2d Индексы, где индексы соответствуют последним 2 измерениям и определены первые оси - PullRequest
0 голосов
/ 12 февраля 2019

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

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

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

...