numpy 3D массив векторизованный доступ с массивами индексов

#python #arrays #python-3.x #numpy #numpy-ndarray

#python #массивы #python-3.x #тупой #numpy-ndarray

Вопрос:

У меня есть 3D-массив numpy A, представляющий пакет изображений: A.shape -> (batch_size, height, width)

Я хочу получить доступ к этому массиву, используя два других массива Hs, Ws размера batch_size. Они содержат индекс x и индекс y каждого изображения, к которому я хочу получить доступ.

Пример 2 изображения размером 3×3:

A. форма (2,3,3)

A = [[[1,2,3],[5,6,7],[8,9,10]], [[10,20,30],[50,60,70],[80,90,100]]]

Hs = [0,2]

Ws = [1,2]

Я хочу получить доступ к A, чтобы я получил:

A[:, Hs,Ws] = [2100]

Выполнение этого следующим образом (A[:, Hs,Ws]), к сожалению, приводит к массиву 2×2 (batch_size x batch_size)

Выполняется с помощью цикла for это будет выглядеть следующим образом:

 Result = np.zeros(batch_size)
for b in range(0,batch_size):
     Result[b] = A[b,Hs[b],Ws[b]]
 

Можно ли сделать это без цикла for, обратившись к A напрямую векторизованным способом?

Ответ №1:

Вы имеете в виду это:

 In [6]: A = np.array(A); Hs=np.array(Hs); Ws=np.array(Ws)
In [7]: A.shape
Out[7]: (2, 3, 3)
In [8]: A[np.arange(2), Hs, Ws]
Out[8]: array([  2, 100])
 

При использовании массивов индексации они «транслируются» друг против друга. Здесь с (2,),(2,),(2,) вещание идет легко.