import numpy as np
A = np.asarray([[0, 1, 2],
[2, 0, 1],
[1, 2, 0]])
col_idxs = np.asarray([2, 1, 1])
row_idxs = np.arange(len(A))
a = A[:, 0].copy()
A[:, 0] = A[row_idxs, col_idxs]
A[row_idxs, col_idxs] = a
или более кратко
c = np.asarray([2, 1, 1])
r = np.arange(len(A))
A[:, 0], A[r, c] = A[r, c], A[:, 0].copy()
Здесь мы используем тот факт, что мы можем индексировать отдельные элементы массива numpy, предоставляя ему два отдельных объекта типа списка для соответствующих индексов строк и столбцов.
Таким образом, строка A[:, 0], A[r, c] = A[r, c], A[:, 0].copy()
может быть прочитана, поскольку получить индексированные элементы из каждого столбца и поменять их местами с первым столбцом.
Редактировать
Спасибо @Paul Panzer за его комментарий, назначение можно сделать еще короче, записав его как A[r, c], A[:, 0] = A[:, 0], A[r, c]
.
Обратите внимание, что порядок присвоения A[r, c]
и A[:, 0]
изменился по сравнению с более ранней версией.
Причина, по которой копию здесь можно опустить, заключается в том, что
- В задании правая часть полностью оценивается перед
присвоение переменных слева.
- Необычное индексирование Numpy (
A[r, c]
здесь) возвращает копию в отличие
кусочки (A[:, 0]
), которые возвращают представление.
Следовательно, то, что говорит эта новая строка кода:
- Получить представление (т. Е. Ссылку) на первый столбец
A
- Создать копию
A[r, c]
. Копия неявная из-за необычной индексации массива Numpy.
- Назначьте
A[r, c]
значения первого столбца A
, используя
вид этого столбца.
- Присвойте первому столбцу
A
копию A[r, c]
, которую мы сделали ранее
(обратите внимание, что к этому моменту A[r, c]
уже был назначен старый
значение A[:, 0]
.)
Кроме того, нам не нужно преобразовывать индексы в массив Numpy.
c = [2, 1, 1]
r = range(len(A))
A[r, c], A[:, 0] = A[:, 0], A[r, c]