获取列表的升序索引

时间:2019-01-27 14:05:25

标签: python python-3.x list numpy sorting

我知道这个问题已经问了一百遍了,但是答案似乎总是“使用numpy的argsort”。但是,要么我误解了大多数人的要求,要么答案不正确。无论如何,我都希望获得列表的升序索引。措辞令人困惑,因此,举例来说,给定列表[4, 2, 1, 3],我希望得到一个返回列表[3, 1, 0, 2]。最小的项是1,因此得到索引0,最大的项是4,因此得到索引3。在我看来,经常建议使用argsort,但似乎并没有这样做。

from numpy import argsort

l = [4, 2, 1, 3]
print(argsort(l))
# [2, 1, 3, 0]
# Expected [3, 1, 0, 2]

很明显argsort在做其他事情,那么它实际上在做什么,并且它与预期行为有何相似之处,以至于经常(错误地)建议这样做?而且,更重要的是,如何获得所需的输出?

3 个答案:

答案 0 :(得分:2)

argsoft()基本上将您的列表转换为索引的排序列表。

l = [4, 2, 1, 3]

首先,它获取列表中每个元素的索引,因此新列表变为:

indexed=[0, 1, 2, 3]

然后根据原始列表中的项目对索引列表进行排序。为4:0 , 2:1 , 1:2 and 3:3,其中:表示“对应于”。

排序我们得到的原始列表

l=[1, 2, 3, 4]

并放置旧列表的每个对应索引的值

new=[2,1,3,0]

因此,基本上,它会根据原始列表对列表的索引进行排序。据我了解。对不起,如果我错了。

希望有帮助

答案 1 :(得分:1)

您没有得到“正确”或预期的答案的原因是因为您问错了问题!

您所追求的是排序后的元素 rank 而 Numpy 的 argsort() 返回已排序的索引列表,如文档所述!。这些不是一回事(正如你所发现的;))!

答案 2 :(得分:0)

@hpaulj 正确回答了我,但在评论中。而且你看不见他。 他的回答对我帮助很大,让我得到了我想要的。

import numpy as np
l = [4, 2, 1, 3]
print(np.argsort(np.argsort(l)))

返回:

[3, 1, 0, 2]

这正是您所期望的。如果数组已排序,此方法将返回数组的索引。

⚠️ 但请注意,如果输入数组包含重复,则有一个有趣的效果:

import numpy as np
l = [4, 2, 1, 3, 4]
print(np.argsort(np.argsort(l)))

返回:

[3 1 0 2 4]

他可能不会伤害你,但他确实伤害了我。我是这样解决这个问题的:

import numpy as np

l = [4, 2, 1, 3, 4]

ret2 = np.vectorize(lambda val: np.searchsorted(np.unique(l), val))(l)

print('Returned', ret2)
print('Expected', [3, 1, 0, 2, 3])

返回:

Returned [3 1 0 2 3]
Expected [3, 1, 0, 2, 3]

是的,由于 vectorize 函数,我的解决方案会很慢。 但是没有什么可以阻止您使用 numba。不过我还没有测试过?。