【问题标题】:Numpy: sort rows of an array by rows in another arrayNumpy:按另一个数组中的行对数组的行进行排序
【发布时间】:2016-04-30 04:18:16
【问题描述】:

我有一个“邻居”的二维数组,我想根据另一个矩阵中的相应行(称为“半径”)对每一行重新排序。下面的代码有效,但它在一个 numpy 数组上使用了 for 循环,我知道这是不正确的方法。这种重新排序的正确 numpy / broadcast 解决方案是什么?

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

【问题讨论】:

    标签: python arrays sorting numpy indexing


    【解决方案1】:

    在 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] 来确定第二行。

    【讨论】:

    • 谢谢,太好了!我认为你有一个小错别字让我一分钟——在第一行,我认为你的最后一个 ) 应该是 ]
    猜你喜欢
    • 1970-01-01
    • 2013-10-04
    • 1970-01-01
    • 2011-09-03
    • 1970-01-01
    • 2011-02-10
    • 2019-10-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多