выбрать по индексу в NumPy - PullRequest
       2

выбрать по индексу в NumPy

3 голосов
/ 05 апреля 2019

Предположим, два массива

ind = 
array([[1, 3, 2, 4, 0],
       [0, 1, 3, 2, 4],
       [3, 4, 2, 0, 1]])

x =
array([[[24, 97, 28, 57, 59],
        [97, 67, 94, 77, 50],
        [56, 89, 25, 55, 76],
        [88, 21,  1, 50, 24]],

       [[54, 83, 64, 81, 12],
        [89, 49, 15, 26, 97],
        [94, 97, 32, 55, 79],
        [24, 63, 63, 15, 40]],

       [[41, 99, 84, 64, 21],
        [12,  9, 85, 43, 28],
        [75, 98, 48, 10,  0],
        [93, 94, 37, 22, 63]]])

Я хочу изменить порядок второго массива в соответствии с первым массивом (первый массив является индексом)

Итак, возможно, результат будет таким, как показано ниже.

array([[[97, 57, 28, 59, 24], 
        [67, 77, 94, 50, 97],
        [89, 55, 25, 76, 56],
        [21, 50,  1, 24, 88]],

       [[54, 83, 81, 64, 12],
        [89, 49, 26, 15, 97],
        [94, 97, 55, 32, 79],
        [24, 63, 15, 63, 40]],

       [[64, 21, 84, 41, 99],
        [43, 28, 85, 12,  9],
        [10,  0, 48, 75, 98],  
        [22, 63, 37, 93, 94]]])
# x[0]s are reordered by ind[0] and so on.

И возможно ли это с np.take ?

1 Ответ

2 голосов
/ 05 апреля 2019

Легко использовать take_along_axis:

>>> np.take_along_axis(x, ind[:, None, :], 2)
array([[[97, 57, 28, 59, 24],
        [67, 77, 94, 50, 97],
        [89, 55, 25, 76, 56],
        [21, 50,  1, 24, 88]],

       [[54, 83, 81, 64, 12],
        [89, 49, 26, 15, 97],
        [94, 97, 55, 32, 79],
        [24, 63, 15, 63, 40]],

       [[64, 21, 84, 41, 99],
        [43, 28, 85, 12,  9],
        [10,  0, 48, 75, 98],
        [22, 63, 37, 93, 94]]])

Если у вас предварительная версия 1.15, вы можете сделать:

>>> m,n,k = x.shape
>>> m,n,k = np.ogrid[:m, :n, :k]
>>> x[m,n,ind[:, None, :]]
array([[[97, 57, 28, 59, 24],
        [67, 77, 94, 50, 97],
        [89, 55, 25, 76, 56],
        [21, 50,  1, 24, 88]],

       [[54, 83, 81, 64, 12],
        [89, 49, 26, 15, 97],
        [94, 97, 55, 32, 79],
        [24, 63, 15, 63, 40]],

       [[64, 21, 84, 41, 99],
        [43, 28, 85, 12,  9],
        [10,  0, 48, 75, 98],
        [22, 63, 37, 93, 94]]])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...