假设你有一个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