假设我有一个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
完成此任务的最佳方法是什么?
答案 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]])