【问题标题】:How to sort a list based on the output of numpy's argsort function如何根据 numpy 的 argsort 函数的输出对列表进行排序
【发布时间】:2015-10-12 12:39:59
【问题描述】:

我有一个这样的列表:

 myList = [10,30,40,20,50]

现在我使用numpy's argsort 函数来获取排序列表的索引:

import numpy as np
so = np.argsort(myList)

这给了我输出:

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

当我想使用 so 对数组进行排序时,它可以正常工作:

myArray = np.array([1,2,3,4,5])
myArray[so]
array([1, 4, 2, 3, 5])

但是当我将它应用到另一个列表时,它不起作用但会引发错误

myList2 = [1,2,3,4,5]
myList2[so]

TypeError:只有一个元素的整数数组可以转换为 索引

我现在如何使用so 对另一个列表进行排序,而不使用 for 循环并且不先将此列表转换为数组?

【问题讨论】:

    标签: python list sorting numpy


    【解决方案1】:

    你不能。您必须将其转换为数组,然后再返回。

    myListSorted = list(np.array(myList)[so])
    

    编辑:我运行了一些基准测试,将 NumPy 方式与列表理解进行比较。 NumPy 快 27 倍

    >>> from timeit import timeit
    >>> import numpy as np
    
    >>> myList = list(np.random.rand(100))
    >>> so = np.argsort(myList) #converts list to NumPy internally
    >>> timeit(lambda: [myList[i] for i in so])
    12.29590070003178
    
    >>> myArray = np.random.rand(100)
    >>> so = np.argsort(myArray)
    >>> timeit(lambda: myArray[so]) 
    0.42915570305194706
    

    【讨论】:

    • 是的,首先将其转换为数组是一种选择,但这是我想避免的。不过还是谢谢你的回答;我投了赞成票。
    • 可以,正如Anand S Kumar 解释的那样。但除此之外,很好的答案
    • @goncalopp 我认为列表推导包含在 for 循环中。
    • @Cleb 使用 NumPy 方法比列表解析快约 28 倍。为什么要避免使用它? >>> timeit(lambda: [l[i] for i in o]) 12.29590070003178 >>> timeit(lambda: a[o]) 0.42915570305194706
    • @rohanp: 什么是 timeit(lambda: a[o])? 'a' 和 'o' 都没有定义。这应该是“myArray”和“so”吗?
    【解决方案2】:

    myList2是一个普通的python列表,不支持这种索引。

    您需要将其转换为 numpy.array ,示例 -

    In [8]: np.array(myList2)[so]
    Out[8]: array([1, 4, 2, 3, 5])
    

    或者你可以使用列表推导 -

    In [7]: [myList2[i] for i in so]
    Out[7]: [1, 4, 2, 3, 5]
    

    【讨论】:

    • 是的,首先将其转换为数组是一种选择,但这是我想避免的。似乎我会去列表理解然后......我赞成它并在以后接受它,如果没有更好的出现。
    • @Cleb 我认为列表理解尽可能好。除非你更喜欢函数式风格的map(myList2.__getitem__, so),这在 python 中看起来很糟糕
    • @goncalopp:是的,我想我同意了。我只是喜欢切片,使用索引等,所以我想知道是否有办法做到这一点。
    猜你喜欢
    • 2018-02-25
    • 2021-03-14
    • 2021-07-22
    • 2015-01-03
    • 1970-01-01
    • 2020-03-19
    • 2012-11-30
    • 2015-08-01
    • 2015-01-08
    相关资源
    最近更新 更多