numpy:基于单独的矢量交换2D数组的位置

时间:2018-09-17 01:03:45

标签: python arrays numpy matrix

假设我有一个3x3的numpy数组:

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

还有一个附加向量:

[2,
 1,
 1]

对于矩阵中的每一行,我想将第0个索引处的数字与向量中对应索引处的数字交换。在此示例中,交换之后,最终输出将是:

[[2, 1, 0], # the 0th and 2nd positions have been swapped
 [0, 2, 1], # the 0th and 1st positions have been swapped
 [2, 1, 0]] # the 0th and 1st positions have been swapped

您该怎么做?

2 个答案:

答案 0 :(得分:1)

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数组的各个元素提供索引,分别为相应的row和col索引提供两个类似列表的对象。

因此,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]的分配顺序已更改。

此处可以省略副本的原因是

  1. 在一项作业中,右侧在进行评估之前 分配给左侧的变量。
  2. 对Numpy进行华丽索引(此处为A[r, c])会返回与 切片(A[:, 0])返回视图。

因此,这段新代码说的是

  1. 获取A第一列的视图(即引用)
  2. 创建A[r, c]的副本。由于对Numpy数组进行了华丽的索引,因此该副本是隐式的。
  3. 使用以下命令为A[r, c]第一列的值分配A 该列的视图。
  4. 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]

答案 1 :(得分:0)

Person.delete()