很抱歉,我的问题可能不够清楚,让很多人感到困惑,它描述得很清楚,这里有解决方案:https://github.com/numpy/numpy/issues/8757
给定列表a
为:
a = [9, 3, 5]
我需要相应的索引如下:
a_indices = [2, 0, 1]
但是当我使用中的方法时,如何在对列表排序后保存原始索引,输出为:
a_indices = [1, 2, 0]
我需要的与此类似:
>>> a = [4, 2, 3, 1, 4]
>>> b = sorted(enumerate(a), key=lambda i: i[1])
[(3, 1), (1, 2), (2, 3), (0, 4), (4, 4)]
上面的输出是正确的,但当我按照下面的方式分配a
时,输出是意外的:
>>> a = [9, 3, 5]
>>> b = sorted(enumerate(a), key=lambda i: i[1])
>>> b
[(1, 3), (2, 5), (0, 9)]
预期输出为:
[(2, 3), (0, 5), (1, 9)]
我对排序功能感到困惑,有人能帮我解释一下吗?
有使用的解决方案
np.argsort(np.argsort(a))
参考:https://github.com/numpy/numpy/issues/8757
您可以在sorted:上使用enumerate
a = [9, 3, 5]
temp = {x: i for i, x in enumerate(sorted(a))}
b = [temp[x] for x in a]
print(b)
输出:
[2, 0, 1]
如果您的列表是[9, 3, 5]
,那么3的索引是1,而不是2;5具有索引2,而不是0;9的索引为0,而不是1。请记住,列表的第一个索引是0,然后第二个索引是1,等等。因此,对于排序列表[3, 5, 9]
,原始索引是[1, 2, 0]
,正如输出正确显示的那样。CCD_ 6实际上是列表CCD_
好了,我有你的问题了。你能做的是:
a = [9,3,5]
b = sorted(enumerate(a), key=lambda i: i[1])
b = [x for x in enumerate(b)]
b = sorted(b, key=lambda i: i[1][0])
ans = [x[0] for x in b]
输出为[2,0.1]
Hey基本上枚举生成(index,value(的元组。所以如果你运行
a=[9,3,5]
print(list(enumerate(a)))
它生成
[(0, 9), (1, 3), (2, 5)]
指示9位于第一位置,3位于第二位置,依此类推(Python具有基于0的索引(。之后是自定义排序
key=lambda i: i[1]
表示使用元组中的第二个元素对列表进行排序,该列表只不过是中的数字
现在我的问题是,python给出的输出根据排序是正确的,但你的预期输出并没有说明为什么会是这样,因为你似乎并不只是想排序。因为[2,0,1]不会用于基于0的索引或基于1的索引。
我不知道为什么您在示例中期望不同的结果:
>>> list(enumerate(a))
[(0, 9), (1, 3), (2, 5)]
返回3个元组,您将根据元组中的第二个元素对其进行排序。换句话说,元组(2, 3)
、(0, 5)
和(1, 9)
不在原始枚举中,因此在对枚举进行排序后无法找到它们。
[(1, 3), (2, 5), (0, 9)]
是正确的结果,即3
是最低值,原始列表中的索引是1等。