2013-11-25 17 views
9

假设你有一个numpy载体[0,3,1,1,1]和你运行argsort 你会得到[0,2,3,4,1]但所有的都是一样的! 我想要的是一种有效的方式来混洗相同值的索引。 任何想法如何做到这一点没有一个while循环与排序向量上的两个索引?如何使argsort结果在等值之间是随机的?

numpy.array([0,3,1,1,1]).argsort() 

回答

3

这是一个黑客,但如果你的数组包含整数,只有你可以添加随机值和结果。 np.random.rand[0, 1)中为您提供结果,因此在这种情况下,您可以保证为不相同的元素维护订单。

>>> import numpy as np 
>>> arr = np.array([0,3,1,1,1]) 
>>> np.argsort(arr + np.random.rand(*arr.shape)) 
array([0, 4, 3, 2, 1]) 
>>> np.argsort(arr + np.random.rand(*arr.shape)) 
array([0, 3, 4, 2, 1]) 
>>> np.argsort(arr + np.random.rand(*arr.shape)) 
array([0, 3, 4, 2, 1]) 
>>> np.argsort(arr + np.random.rand(*arr.shape)) 
array([0, 2, 3, 4, 1]) 
>>> np.argsort(arr + np.random.rand(*arr.shape)) 
array([0, 2, 3, 4, 1]) 
>>> np.argsort(arr + np.random.rand(*arr.shape)) 
array([0, 4, 2, 3, 1]) 

这里,我们看到指数0永远是第一位在argsort结果和指数1是最后,但结果的,其余都是以随机顺序。

一般而言,您可以生成以np.diff(np.sort(arr)).max()为界的随机值,但在某些时候您可能会遇到精度问题。

+0

是不是太大的假设承担向量仅包含整数? –

+0

嗯,我不知道。我正在回答这个问题,并在我的回答中得到了承认。虽然你的解决方案很整洁。 – YXD

11

使用lexsortnp.lexsort((b,a))排序指a,然后通过b

>>> a 
array([0, 3, 1, 1, 1]) 
>>> b=np.random.random(a.size) 
>>> b 
array([ 0.00673736, 0.90089115, 0.31407214, 0.24299867, 0.7223546 ]) 
>>> np.lexsort((b,a)) 
array([0, 3, 2, 4, 1]) 
>>> a.argsort() 
array([0, 2, 3, 4, 1]) 
>>> a[[0, 3, 2, 4, 1]] 
array([0, 1, 1, 1, 3]) 
>>> a[[0, 2, 3, 4, 1]] 
array([0, 1, 1, 1, 3]) 
相关问题