我有一个“邻居”的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]]
答案 0 :(得分:3)
在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]
确定第二行。