При индексации массивов Numpy вы можете использовать отдельные элементы.Давайте использовать массив 3x4, чтобы иметь возможность различать оси:
In [1]: x1 = np.array([[1, 2, 3, 4],
...: [5, 6, 7, 8],
...: [9, 10, 11, 12]], dtype=int)
In [2]: x1[0, 0]
Out[2]: 1
Если вы просмотрите Numpy Advanced indexing , вы обнаружите, что вы можете сделать больше в индексировании, предоставляя спискидля каждого измерения.Рассмотрим индексирование с помощью x1[rows..., cols...]
, давайте возьмем два элемента.
Выбор из первой и второй строки, но всегда из первого столбца:
In [3]: x1[[0, 1], [0, 0]]
Out[3]: array([1, 5])
Вы даже можете индексировать с помощью массивов:
In [4]: x1[[[0, 0], [1, 1]], [[0, 1], [0, 1]]]
Out[4]:
array([[1, 2],
[5, 6]])
np.indices
создает массив строк и столбцов, который, если используется для индексации, возвращает исходный массив:
In [5]: grid = np.indices(x1.shape)
In [6]: np.alltrue(x1[grid[0], grid[1]] == x1)
Out[6]: True
Теперь, если вы перемешаете значения grid[0]
colв противном случае, но оставьте grid[1]
как есть, а затем используйте их для индексации, вы получите массив со перемешанными значениями столбцов.
Каждый индексный вектор столбца равен [0, 1, 2]
.Теперь код перетасовывает эти индексные векторы столбцов для каждого столбца индивидуально и складывает их вместе в rand_x
в ту же форму, что и x1
.
Создайте один индексный вектор перетасованного столбца:
In [7]: np.random.seed(0)
In [8]: np.random.choice(x1.shape[0], size=x1.shape[0], replace=False)
Out[8]: array([2, 1, 0])
Стекирование выполняется с помощью (псевдокода) стека с [random-index-col-vec for cols in range(x1.shape[1])]
и затем транспонированием (.T
).
Чтобы сделать его немного понятнее, мы можем переписать i как col
и использовать column_stack
вместо np.array ([... для столбца]). T:
In [9]: np.random.seed(0)
In [10]: col_list = [np.random.choice(x1.shape[0], size=x1.shape[0], replace=False)
for col in range(x1.shape[1])]
In [11]: col_list
Out[11]: [array([2, 1, 0]), array([2, 0, 1]), array([0, 2, 1]), array([2, 0, 1])]
In [12]: rand_x = np.column_stack(col_list)
In [13]: rand_x
Out[13]:
array([[2, 2, 0, 2],
[1, 0, 2, 0],
[0, 1, 1, 1]])
In [14]: x1[rand_x, grid[1]]
Out[14]:
array([[ 9, 10, 3, 12],
[ 5, 2, 11, 4],
[ 1, 6, 7, 8]])
Примечание:
- пример вывода, который вы даете, отличается от того, чтоФункция, которую вы предоставляете, делает.Кажется, это транспонировано.
- использование
rand_x
и rand_y
в примере кода может привести к путанице при использовании для соглашения x = индекс столбца, y = индекс строки