numpy:根据单独的向量交换2D数组的值

时间:2018-09-17 18:34:52

标签: python arrays numpy matrix

假设我有一个3x4的numpy数组,如下所示:

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

假设我还有一个附加向量:

[2,
 1,
 2,
 1]

对于每一行,我想找到在附加向量中找到的值的索引,并将其与numpy数组中的第一列交换。

例如,向量中的第一项是2,在我的numpy数组的第一行中,2在第三列中,因此我想交换第一列和第三列对于该行,然后在其他每一行中继续执行此操作。

[[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 :(得分:1)

设置

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 < / em>索引):

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]])