Расширенное индексирование - управление поведением вне границ - PullRequest
1 голос
/ 08 апреля 2020

Я пытаюсь решить вопрос определения поведения вне границ для индексирования массивов. Предыдущий вопрос см .: Как я могу динамически векторизовать замену значений массива другим (меньшим) массивом?

Если у меня есть следующие примеры данных:

array_large = [[0,0,0,0,0],[0,0,0,0,0],[0,0,0,0,0]] 
array_small = [[1,2],[3,4],[5,6]] 
array_index = [[1],[4],[5]] #*random index

Использование этого кода

i = np.arange(array_large.shape[0])[:,None]
j = array_index+np.arange(array_small.shape[1])
array_large[i,j] = array_small

Поведение для array_index [0] понятно, но если индекс превышает целевой массив, возникает ошибка. Я хотел бы игнорировать недопустимый индекс, но индексировать как можно меньший массив в больший. Как я могу обработать эти ошибки при условии, что желаемый результат будет:

array_large = [[0,1,2,0,0],[0,0,0,0,3],[0,0,0,0,0]] 

1 Ответ

2 голосов
/ 08 апреля 2020

Мы можем воспользоваться тем фактом, что array_large состоит из 0s для определения маски, и установить эти индексы от array_large.shape[1] до 0, а также их соответствующие значения в array_small:

i = np.arange(array_large.shape[0])[:,None]
j = array_index+np.arange(array_small.shape[1])
m = j<array_large.shape[1]
array_large[i,j*m] = array_small*m

print(array_large)

array([[0, 1, 2, 0, 0],
       [0, 0, 0, 0, 3],
       [0, 0, 0, 0, 0]])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...