Numpy: поменять значения 2D массива на основе отдельного вектора - PullRequest
0 голосов
/ 17 сентября 2018

Допустим, у меня есть массив NxPy 3x4, например:

[[0, 1, 2],
 [2, 0, 1],
 [0, 2, 1],
 [1, 2, 0]]

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

[2,
 1,
 2,
 1]

Для каждой строки я хочунайти индекс значения, найденного в моем дополнительном векторе, и поменять его на первый столбец в моем массиве.

Например, первая запись в моем векторе - 2, а в первой строкемой массивный массив 2 находится в 3-м столбце, поэтому я хочу поменять местами первый и третий столбцы для этой строки и продолжить это для каждой дополнительной строки.

[[2, 1, 0], # the number in the 0th position (0) and 2 have swapped placement
 [1, 0, 2], # the number in the 0th position (2) and 1 have swapped placement
 [2, 0, 1], # the number in the 0th position (0) and 2 have swapped placement
 [1, 2, 0]  # the number in the 0th position (1) and 1 have swapped placement

Какой наилучший способ выполнитьэто?

1 Ответ

0 голосов
/ 17 сентября 2018

Настройка

arr = np.array([[0, 1, 2],  [2, 0, 1],  [0, 2, 1],  [1, 2, 0]])
vals = np.array([2,  1,  2,  1])

Во-первых, вам нужно найти индекс ваших значений, который мы можем выполнить с помощью широковещания и argmax (Это будетнайдите индекс first , не обязательно индекс only ):

idx = (arr == vals[:, None]).argmax(1)
# array([2, 2, 1, 0], dtype=int64)

Теперь с использованием базового индексирования и назначения:

r = np.arange(len(arr))
arr[r, idx], arr[:, 0] = arr[:, 0], arr[r, idx]

Вывод:

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