Простой способ сокращения nd-массива с помощью расширенного индексирования в Python - PullRequest
0 голосов
/ 26 марта 2020

Я знаю, что должен быть элегантный способ сделать это, используя расширенную индексацию, я просто не могу понять это.

Предположим, у меня есть массив (2,3,4)

x = array([[[ 0,  1,  2,  3],
        [ 4,  5,  6,  7],
        [ 8,  9, 10, 11]],

       [[12, 13, 14, 15],
        [16, 17, 18, 19],
        [20, 21, 22, 23]]])

и массив (4,) y = array([1,0,1,1])

Какой самый элегантный способ получить массив (3,4), который

z = np.zeros((3,4))
for ii in xrange(3):
    for jj in xrange(4):
         z[ii,jj] = x[y[jj],ii,jj]

создает?

1 Ответ

1 голос
/ 26 марта 2020
In [490]: x[y,:,np.arange(4)]                                                                  
Out[490]: 
array([[12, 16, 20],
       [ 1,  5,  9],
       [14, 18, 22],
       [15, 19, 23]])

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

In [491]: x[y,:,np.arange(4)].T                                                                
Out[491]: 
array([[12,  1, 14, 15],
       [16,  5, 18, 19],
       [20,  9, 22, 23]])

(эта базовая / расширенная причуда задокументирована и обсуждена в некоторых SO.)

или с расширенной индексацией:

In [492]: x[y,np.arange(3)[:,None],np.arange(4)]                                               
Out[492]: 
array([[12,  1, 14, 15],
       [16,  5, 18, 19],
       [20,  9, 22, 23]])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...