Поменяйте местами несколько индексов в 2d массиве - PullRequest
3 голосов
/ 27 января 2020

Проблема

Для следующего массива:

import numpy as np

arr = np.array([[i for i in range(10)] for j in range(5)])

# arr example
array([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
       [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
       [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
       [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
       [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]])

Для каждой строки в arr я пытаюсь поменять местами n (в данном случае 2 ) индексы согласно некоторому 2-мерному массиву, например.

swap = np.random.choice(arr.shape[1], [arr.shape[0], 2], replace=False)

# swap example
array([[8, 1],
       [5, 0],
       [7, 2],
       [9, 4],
       [3, 6]])

Вопрос

Я пытался arr[:, swap] = arr[:, swap[:, ::-1]], но при этом выполняется каждый своп для каждой строки, а не только свопирование индексов строка за строкой. Поведение, которого я пытаюсь достичь, приведено ниже. Это возможно без итерации по swap?

for idx, s in enumerate(swap):
   arr[idx, s] = arr[idx, s[::-1]]

# new arr with indices swapped
array([[0, 8, 2, 3, 4, 5, 6, 7, 1, 9],
       [5, 1, 2, 3, 4, 0, 6, 7, 8, 9],
       [0, 1, 7, 3, 4, 5, 6, 2, 8, 9],
       [0, 1, 2, 3, 9, 5, 6, 7, 8, 4],
       [0, 1, 2, 6, 4, 5, 3, 7, 8, 9]])

1 Ответ

3 голосов
/ 27 января 2020

Вы можете использовать «вспомогательный» массив для индексации arr. Помощник приводит arr в правильную форму.

import numpy as np

arr = np.array([[i for i in range(10)] for j in range(5)])
swap = np.array([[8, 1], [5, 0], [7, 2], [9, 4], [3, 6]])

helper = np.arange(arr.shape[0])[:, None]
# helper is
# array([[0],
#        [1],
#        [2],
#        [3],
#        [4]])
# arr[helper] is
# array([[[0, 8, 2, 3, 4, 5, 6, 7, 1, 9]],
#        [[5, 1, 2, 3, 4, 0, 6, 7, 8, 9]],
#        [[0, 1, 7, 3, 4, 5, 6, 2, 8, 9]],
#        [[0, 1, 2, 3, 9, 5, 6, 7, 8, 4]],
#        [[0, 1, 2, 6, 4, 5, 3, 7, 8, 9]]])

arr[helper, swap] = arr[helper, swap[:, ::-1]]

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