我有以下问题。是否有一些方法有numpy或scipy,我可以使用它来获得这样的给定的未排序数组
a = np.array([0,0,1,1,4,4,4,4,5,1891,7]) #could be any number here
到插值/映射数字的位置,值之间没有间隙,它们的顺序和之前的顺序相同?:
[0,0,1,1,2,2,2,2,3,5,4]
修改
是否可以在映射后交换/随机播放数字,以便
[0,0,1,1,2,2,2,2,3,5,4]
变得像:
[0,0,3,3,5,5,5,5,4,1,2]
答案 0 :(得分:1)
编辑:我不确定这里的礼节是什么(这应该是一个单独的答案?),但这实际上可以直接从np.unique
获得。
>>> u, indices = np.unique(a, return_inverse=True)
>>> indices
array([0, 0, 1, 1, 2, 2, 2, 2, 3, 5, 4])
原始答案:通过构建数组的每个值将映射到的索引的字典,这在普通python中难以做到:
x = np.sort(np.unique(a))
index_dict = {j: i for i, j in enumerate(x)}
[index_dict[i] for i in a]
答案 1 :(得分:1)
您的数组似乎需要rank
(密集),在这种情况下使用scipy.stats.rankdata
:
from scipy.stats import rankdata
rankdata(a, 'dense')-1
# array([ 0., 0., 1., 1., 2., 2., 2., 2., 3., 5., 4.])