假设你有一个numpy
向量[0,3,1,1,1]
,并运行argsort
后,你将得到[0,2,3,4,1]
,但所有的1都是相同的!我想要一种有效的方法来随机打乱相同值的索引。有什么好的想法可以不使用带有两个指数的排序向量上的while循环来完成吗?
numpy.array([0,3,1,1,1]).argsort()
使用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])
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()
限制的随机值,但在某些情况下可能会遇到精度问题。