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()
是一个缓慢的操作。伟大的解决方案!