#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,) вещание идет легко.