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

Python Numpy:按另一个数组中的行对数组中的行进行排序,python,arrays,sorting,numpy,indexing,Python,Arrays,Sorting,Numpy,Indexing,我有一个“邻居”的2D数组,我想根据另一个矩阵中的对应行(称为“半径”)对每一行重新排序。下面的代码可以工作,但它在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(

我有一个“邻居”的2D数组,我想根据另一个矩阵中的对应行(称为“半径”)对每一行重新排序。下面的代码可以工作,但它在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]]

在NumPy中,您可以这样写:

>>> neighbors[np.arange(2)[:, None], order]
array([[6, 7, 8],
       [1, 3, 2]])
array([[0],
       [1]])
array([[2, 1, 0],
       [2, 0, 1]])
(更一般地说,您应该将第一个索引写成
np.arange(order.shape[0])[:,None]

这是因为
np.arange(2)[:,None]
看起来像这样:

>>> neighbors[np.arange(2)[:, None], order]
array([[6, 7, 8],
       [1, 3, 2]])
array([[0],
       [1]])
array([[2, 1, 0],
       [2, 0, 1]])
顺序是这样的:

>>> neighbors[np.arange(2)[:, None], order]
array([[6, 7, 8],
       [1, 3, 2]])
array([[0],
       [1]])
array([[2, 1, 0],
       [2, 0, 1]])

对于奇特的索引,NumPy对从数组中分离出来,对每个轴进行索引。行索引
[0]
与列索引
[2,1,0]
配对,新行的创建顺序由此确定。同样,对于
[1]
[2,0,1]
来确定第二行。

谢谢,这太棒了!我想你的一个小错误让我有一分钟的时间——在第一行,我想你的最后一行)应该是a]