如何在使用argsort后获得订单?

时间:2016-02-01 17:07:36

标签: python numpy

所以我有一个例如[-0.7, -3.7, -2.1, -5.8, -1.2 ]的数组 这些特定的数字对应于有序的标签:例如0.7对应于标签201,3.7对应于标签202,依此类推。

在正常排序时,我收到[-5.8,-3.7,-2.1,-1.2,-0.7]。我有兴趣从这些中挑选前3个值,但在排序时,我会忘记标签。 现在按顺序对它们进行排序我使用 np.argsort 。这给了我[1,2,0]。这告诉我4的值具有低概率,而0的概率很高。

我的问题是argsort,我怎样才能让我的映射回来?我怎么知道我的标签现在在哪里?有没有办法在使用argsort时跟踪它们?

3 个答案:

答案 0 :(得分:2)

这是一个副本并使用内置的排序方法,但我认为它实现了你想要的。

vals = [-0.7, -3.7, -2.1, -5.8, -1.2 ]
label_inds_vals = sorted([thing for thing in enumerate(vals)], key=lambda x: x[1])

排序值还带有索引,可用于索引标签数组中的相应标签。

如果列表清单:

value_lists = [[-0.7,-3.2,-2.1,-5.8,-1.2],[ - 1.2,-3.2,-3.4,-5.4,-6.4]]

for vals in value_lists:
    #reverse depending if you want top 3 or bottom
    label_inds_vals = sorted([thing for thing in enumerate(vals)], key=lambda x: x[1], reverse = True)         
    print label_inds_vals[:3]

答案 1 :(得分:1)

这里的典型模式是装饰 - 排序 - 不合理。

基本上,您希望按其值排序标签,而不是这样的值;所以,让自己成为一组价值标签元组,然后对它们进行排序:

tuples = zip(value,labels) ## doesn't copy the elements of these two sequences, but generates a new set of references to these
sorted_tuples = sorted(tuples, key = lambda tup: tup[0])

现在,600万个条目不是,但它对于现代PC来说也不是那么多。也许您仍然应该考虑使用一些将数据视为原始数据表而非极其灵活的内容,因此包含引用(这些引用可能比实际值或标签更大)python {{ 1}}。

list

Numpy为您提供了大量处理更大数据表的方法。

答案 2 :(得分:1)

我的标签现在在哪里,有点不清楚你的意思。

但也许使用argsort会有所帮助

In [163]: values=np.array([-0.7, -3.7, -2.1, -5.8, -1.2 ])

制作标签数组:

In [164]: labels=np.array([200,201,202,203,204])

argsort提供了一系列索引,可用于重新排序valueslabels。请注意,此应用程序不会更改原始数组。

In [165]: ind=np.argsort(values)
In [166]: ind
Out[166]: array([3, 1, 2, 4, 0], dtype=int32)
In [167]: values[ind]
Out[167]: array([-5.8, -3.7, -2.1, -1.2, -0.7])
In [168]: labels[ind]
Out[168]: array([203, 201, 202, 204, 200])

如果我将argsort应用于ind,我会获得另一组索引,让我可以将值归结为原始订单。

In [169]: ind1=np.argsort(ind)
In [170]: ind1
Out[170]: array([4, 1, 2, 0, 3], dtype=int32)
In [171]: labels[ind][ind1]
Out[171]: array([200, 201, 202, 203, 204])
In [172]: 

我想你已经在使用这样的表达式来获得前三个值

In [180]: ind[:3]
Out[180]: array([3, 1, 2], dtype=int32)  # location of the top 3
In [181]: values[ind[:3]]
Out[181]: array([-5.8, -3.7, -2.1])   # the top 3
In [182]: labels[ind[:3]]
Out[182]: array([203, 201, 202])   # and their labels