假设您有一个numpy
向量[0,3,1,1,1]
并且您运行argsort
你会得到[0,2,3,4,1]
,但所有的都是一样的!
我想要的是一种有效的方法来改变相同值的索引。
如果没有在循环向量上有两个索引的while循环,怎么办呢?
numpy.array([0,3,1,1,1]).argsort()
答案 0 :(得分:13)
使用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])
答案 1 :(得分:3)
这有点像黑客,但如果你的数组只包含整数,你可以添加随机值并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()
限定的随机值,但在某些时候您可能会遇到精度问题。