Python:将值映射到其他值而没有间隙

时间:2018-03-23 22:49:55

标签: python numpy scipy mapping interpolation

我有以下问题。是否有一些方法有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]

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.])