Numpy:按照另一个数组中的行对数组的行进行排序

5

我有一个"neighbors"的二维数组,我想根据另一个矩阵(称为"radii")中对应的行来重新排列每一行。下面的代码可以工作,但它使用了一个numpy数组上的for循环,我知道这不是正确的方法。有什么正确的NumPy / 广播解决方案来重新排序吗?

neighbors = np.array([[8,7,6], [3,2,1]])
radii = np.array([[0.4, 0.2, 0.1], [0.3, 0.9, 0.1]])

order = radii.argsort(axis=1)
for i in range(2):
    neighbors[i] = neighbors[i,order[i]]
print(neighbors)

# Result:
[[6 7 8]
 [1 3 2]]
1个回答

4
在NumPy中,您可以编写如下内容:
>>> neighbors[np.arange(2)[:, None], order]
array([[6, 7, 8],
       [1, 3, 2]])

更一般地,你应该写成np.arange(order.shape[0])[:, None]作为第一个索引。

这个方法的原理是因为np.arange(2)[:, None]看起来像这样:

array([[0],
       [1]])

下单的流程如下所示:

array([[2, 1, 0],
       [2, 0, 1]])

对于高级索引,NumPy将每个轴的数组进行配对索引。行索引 [0] 与列索引 [2, 1, 0] 配对,并按照此顺序创建新行。同样,对于 [1][2, 0, 1] 确定第二行。

谢谢,这很棒!我认为你有一个小错字让我困惑了一分钟——在第一行,我认为你的最后一个)应该是一个]。 - Jason Maldonis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接