Широкое индексирование вещания вводит новое измерение - PullRequest
0 голосов
/ 07 февраля 2019

У меня есть массив, который я хочу использовать для отображения.Давайте назовем это my_map, тип float shape (m, c).

У меня есть второй массив с индексами, чтобы не называть его my_indexes, введите int size (n, c), каждое значение находится между0 и м.

Пытаясь индексировать my_map делая my_ans = my_map[my_indexes], я получаю массив формы (n, c, c), когда я ожидал (n, c).Каков был бы правильный способ сделать это?

Просто чтобы было ясно, что я пытаюсь сделать что-то эквивалентное:

my_ans = np.empty_like(touch_probability)
for i in range(c):
    my_ans[:,i] = my_map[:,i][my_indexes[:,i]]

1 Ответ

0 голосов
/ 07 февраля 2019

Чтобы проиллюстрировать и проверить вашу проблему, определите простые, реальные массивы:

In [44]: arr = np.arange(12).reshape(3,4)
In [45]: idx = np.array([[0,2,1,0],[2,2,1,0]])
In [46]: arr.shape
Out[46]: (3, 4)
In [47]: idx.shape
Out[47]: (2, 4)

Ваш желаемый расчет:

In [48]: res = np.zeros((2,4), int)
In [49]: for i in range(4):
    ...:     res[:,i] = arr[:,i][idx[:,i]]  # same as arr[idx[:,i], i]

    ...:     
In [50]: res
Out[50]: 
array([[0, 9, 6, 3],
       [8, 9, 6, 3]])

Выполнение того же действия с одним шагом индексации:

In [51]: arr[idx, np.arange(4)]
Out[51]: 
array([[0, 9, 6, 3],
       [8, 9, 6, 3]])

Это передает два индексирующих массива друг на друга, а затем выбирает точки:

In [52]: np.broadcast_arrays(idx, np.arange(4))
Out[52]: 
[array([[0, 2, 1, 0],
        [2, 2, 1, 0]]), 
 array([[0, 1, 2, 3],
        [0, 1, 2, 3]])]

Таким образом, мы индексируем массив (m, c) с 2 (n, c) массивами


То же самое:

arr [idx] arr [idx,:]

Используется idx для выбора целых строк из arrв результате получается форма idx плюс последнее измерение arr.Где то, что вы хотите, это просто элемент ith строки idx[j,i].

...