假設你有一個numpy
載體[0,3,1,1,1]
和你運行argsort
你會得到[0,2,3,4,1]
但所有的都是一樣的! 我想要的是一種有效的方式來混洗相同值的索引。 任何想法如何做到這一點沒有一個while循環與排序向量上的兩個索引?如何使argsort結果在等值之間是隨機的?
numpy.array([0,3,1,1,1]).argsort()
假設你有一個numpy
載體[0,3,1,1,1]
和你運行argsort
你會得到[0,2,3,4,1]
但所有的都是一樣的! 我想要的是一種有效的方式來混洗相同值的索引。 任何想法如何做到這一點沒有一個while循環與排序向量上的兩個索引?如何使argsort結果在等值之間是隨機的?
numpy.array([0,3,1,1,1]).argsort()
這是一個黑客,但如果你的數組包含整數,只有你可以添加隨機值和結果。 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()
爲界的隨機值,但在某些時候您可能會遇到精度問題。
使用lexsort
: np.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])
是不是太大的假設承擔向量僅包含整數? –
嗯,我不知道。我正在回答這個問題,並在我的回答中得到了承認。雖然你的解決方案很整潔。 – YXD