Han*_*art 11 python sorting random numpy
假设你有一个numpy向量[0,3,1,1,1],你运行argsort
你会得到[0,2,3,4,1]但所有的都是一样的!我想要的是一种有效的方法来改变相同值的索引.有没有想法如何在没有带有两个索引的while循环的情况下做到这一点?
numpy.array([0,3,1,1,1]).argsort()
Run Code Online (Sandbox Code Playgroud)
CT *_*Zhu 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])
Run Code Online (Sandbox Code Playgroud)
这有点麻烦,但如果您的数组仅包含整数,您可以添加随机值并对结果进行 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])
Run Code Online (Sandbox Code Playgroud)
在这里我们看到索引0总是在argsort结果中第一个,索引1是最后一个,但其余结果是随机顺序的。
一般来说,您可以生成以 为界的随机值np.diff(np.sort(arr)).max(),但在某些时候您可能会遇到精度问题。
| 归档时间: |
|
| 查看次数: |
1516 次 |
| 最近记录: |