使用scipy,您正在寻找的功能是scipy.stats.rankdata:
In [13]: import scipy.stats as ssIn [19]: ss.rankdata([3, 1, 4, 15, 92])Out[19]: array([ 2., 1., 3., 4., 5.])In [20]: ss.rankdata([1, 2, 3, 3, 3, 4, 5])Out[20]: array([ 1., 2., 4., 4., 4., 6., 7.])
队伍从1开始,而不是0(如在你的例子),但话又说回来,就是这样
R的
rank功能的作品也是如此。
这是
scipy的rankdata函数的纯Python等效项:
def rank_simple(vector): return sorted(range(len(vector)), key=vector.__getitem__)def rankdata(a): n = len(a) ivec=rank_simple(a) svec=[a[rank] for rank in ivec] sumranks = 0 dupcount = 0 newarray = [0]*n for i in xrange(n): sumranks += i dupcount += 1 if i==n-1 or svec[i] != svec[i+1]: averank = sumranks / float(dupcount) + 1 for j in xrange(i-dupcount+1,i+1): newarray[ivec[j]] = averank sumranks = 0 dupcount = 0 return newarrayprint(rankdata([3, 1, 4, 15, 92]))# [2.0, 1.0, 3.0, 4.0, 5.0]print(rankdata([1, 2, 3, 3, 3, 4, 5]))# [1.0, 2.0, 4.0, 4.0, 4.0, 6.0, 7.0]



