2013-11-25 19 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]) 
相關問題