在有联系的情况下将numpy.argsort输出随机化

时间:2019-06-25 10:52:52

标签: python arrays numpy sorting random

我有一个numpy数组,其中某些元素与其他元素相同,即存在联系,并且我应用np.argsort来查找将对数组进行排序的索引:

In [29]: x = [1, 2, 1, 1, 5, 2]

In [30]: np.argsort(x)
Out[30]: array([0, 2, 3, 1, 5, 4])

In [31]: np.argsort(x)
Out[31]: array([0, 2, 3, 1, 5, 4])

从这里可以看出,两次运行argsort所获得的输出是相同的。但是,array([2, 3, 0, 5, 1, 4])也是完全有效的输出,因为原始数组中的某些元素相等。当数组中有联系时,我可以使argsort返回此类“随机”输出吗?如果不是,那是一种解决方法,因为在选择它们时,我不想偏向于选择数组中的最小值。

1 个答案:

答案 0 :(得分:3)

一种技巧是在[0,1)范围内添加均匀噪声,然后执行argsorting。添加这样的噪声会强制仅在它们各自的容器中进行排序,并给出仅限于这些容器的随机排序索引-

(x+np.random.rand(len(x))).argsort()