【问题标题】:Is there a numpy function for sorting according to a vector with indices?是否有根据带有索引的向量进行排序的 numpy 函数?
【发布时间】:2019-06-29 07:14:22
【问题描述】:

我想根据另一个带有索引的 numpy 向量对一个 numpy 向量进行排序。

import numpy as np
my_vector = np.array([9. 6. 21. 17. 12.])
my_indices = np.array([1. 4. 2. 0. 3.])

what_i_want = np.array([17. 9. 21. 12. 6.])

有这个功能吗?类似反向 argsort 的东西

【问题讨论】:

    标签: python numpy sorting permutation


    【解决方案1】:

    使用高级赋值可以在 O(n) 内完成:

    my_vector = np.array([9., 6., 21., 17., 12.])
    my_indices = np.array([1., 4., 2., 0., 3.])
    my_result = np.empty_like(my_vector)
    my_result[my_indices.astype(int)] = my_vector
    my_result
    # array([17.,  9., 21., 12.,  6.])
    

    一个更大的例子的时间安排:

    from timeit import timeit
    
    a = np.random.random(1000000)
    b = np.random.permutation(1000000).astype(float)
    
    def fargsort():
        return(a[b.argsort()])
    
    def fassign():
        c = np.empty_like(a)
        c[b.astype(int)] = a
        return c
    
    np.all(fargsort() == fassign())
    # True
    timeit(fargsort,number=10)
    # 1.2764090860000579
    timeit(fassign,number=10)
    # 0.17262099700747058
    

    【讨论】:

    • 这是完美的,实际上使用 my_indices 包含实际索引的事实。对于经验性能比较也很棒(并且验证结果是相同的)
    【解决方案2】:

    如下使用argsort

    import numpy as np
    my_vector = np.array([9., 6., 21., 17., 12.])
    my_indices = np.array([1., 4., 2., 0., 3.])
    
    print(my_vector[my_indices.argsort()])
    

    输出:

    [17. 9. 21. 12. 6.]

    【讨论】:

    • 注意:argsort 的元素 my_indices 不必是 my_vector 中的有效索引,它们的排序值只需与您希望 my_vector 的排序方式相对应
    【解决方案3】:

    你可以试试这个:

    import numpy as np
    my_vector = np.array([9., 6., 21., 17., 12.])
    my_indices = np.array([1., 4., 2., 0., 3.])
    
    res_sorted = [x for _,x in sorted(zip(my_indices,my_vector))]
    print(res_sorted)
    

    输出:

    [17.0, 9.0, 21.0, 12.0, 6.0]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-29
      • 1970-01-01
      • 2019-08-18
      • 1970-01-01
      • 2012-08-12
      • 2019-10-05
      • 1970-01-01
      相关资源
      最近更新 更多