Python 将数组中的值映射到它们的排序索引

Python 将数组中的值映射到它们的排序索引,python,numpy,Python,Numpy,我试图通过将数组中的值映射到它们的排序索引来最小化这些值 例如,[8,8,15,3,5]将变成[2,2,3,0,1]。我能够用下面的代码完成,但对于大型阵列,这需要很长时间 a = [8, 8, 15, 3, 5] a_mapped = np.zeros(len(a)) a_sorted = sorted(a) for i in range(len(a)): a_mapped[i] = a_sorted.index(a[i]) 有没有一种更快的方法,可能是使用numpy函数?如果您使

我试图通过将数组中的值映射到它们的排序索引来最小化这些值

例如,
[8,8,15,3,5]
将变成
[2,2,3,0,1]
。我能够用下面的代码完成,但对于大型阵列,这需要很长时间

a = [8, 8, 15, 3, 5]
a_mapped = np.zeros(len(a))
a_sorted = sorted(a)
for i in range(len(a)):
     a_mapped[i] = a_sorted.index(a[i])

有没有一种更快的方法,可能是使用numpy函数?

如果您使用
scipy
,您可以从
scipy
使用
rankdata

from scipy.stats import rankdata
import numpy as np

a = np.array([8, 8, 15, 3, 5])

rankdata(a, method='dense') - 1
# [2 2 3 0 1]

np.unique
可以满足您的需求:

In [29]: arr=np.array([8, 8, 15, 3, 5])
In [30]: np.unique(arr, return_inverse=True)
Out[30]: (array([ 3,  5,  8, 15]), array([2, 2, 3, 0, 1]))

就其本质而言,
list.index()
是一个缓慢的操作。伟大的解决方案!