当前位置: 首页 > 面试题库 >

在Python中计算列表排名向量的有效方法

曹子平
2023-03-14
问题内容

我正在寻找一种类似于Rrank函数的高效方法来计算Python中列表的秩向量。在一个简单的列表与所述元件之间没有联系,元件
的列表的秩矢量的l应该是 X 当且仅当l[i]X 个在排序的列表元素。到目前为止,这很简单,以下代码片段可以解决问题:

def rank_simple(vector):
    return sorted(range(len(vector)), key=vector.__getitem__)

但是,如果原始列表具有联系(即,多个具有相同值的元素),事情就会变得复杂。在这种情况下,所有具有相同值的元素都应具有相同的等级,这是使用上述朴素方法获得的等级的平均值。因此,例如,如果我有[1, 2, 3, 3, 3, 4, 5],那么天真的排名会给我[0, 1, 2, 3, 4, 5, 6],但是我想拥有的是[0, 1, 3, 3, 3, 5, 6]。在Python中,哪一种是最有效的方法?

脚注:我不知道NumPy是否已经有实现此目标的方法。如果可以的话,请告诉我,但是无论如何,我将对纯Python解决方案感兴趣,因为我正在开发一种也可以在没有NumPy的情况下使用的工具。


问题答案:

使用scipy,您正在寻找的功能是scipy.stats.rankdata:

In [13]: import scipy.stats as ss
In [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(如在你的例子),但话又说回来,就是这样Rrank功能的作品也是如此。

这是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 newarray

print(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]


 类似资料:
  • 问题内容: 在python中旋转列表的最有效方法是什么?现在我有这样的事情: 有没有更好的办法? 问题答案: 已针对两端的推拉进行了优化。他们甚至有专门的方法。

  • 问题内容: 我正在尝试使用Haversine公式来计算由纬度和经度标识的一长串位置的距离矩阵,该公式采用两个坐标对的元组来产生距离: 我可以使用嵌套的for循环计算所有点之间的距离,如下所示: 使用一个简单的函数: 但是考虑到时间的复杂性,这需要花费相当长的时间,大约需要20秒才能获得500点,而且我的清单要长得多。这让我着眼于矢量化,并且遇到了((docs)),但无法弄清楚如何在这种情况下应用它

  • 本文向大家介绍python列表中有计算单词串联数量的程序,包括了python列表中有计算单词串联数量的程序的使用技巧和注意事项,需要的朋友参考一下 假设我们有一个字符串列表;我们还必须在列表中找到与其他单词串联的单词数量。连接和连接任意次数时,我们可以重用单词。 因此,如果输入像单词= [“” hello“,” world“,” helloworld“,” famous“,” worldfamou

  • 问题内容: 我想计算构面查询UI的构面计数,但是我想我缺少一些东西,因为无法使用构面过滤器获取所需的数字。 这是一个例子。给定两个方面,每个方面都有三个可能的术语: 当我进行搜索时,一个方面中每个字词的计数都没有考虑另一个方面中设置的过滤条件。 为了显示: 请注意,每个方面内的总数等于查询的命中总数,就好像未设置过滤器一样。 我想要的行为是“注释”构面中的数字考虑到“颜色”构面中的过滤器,反之亦然

  • 我有一张类似“ 我想创建一个新的列,在那里它将计数在最后4列中有值的列数。 我如何在Python中做到这一点? 提前道谢。

  • 问题内容: 我使用别名来引用计算列。这是我尝试制作的实际代码的一部分,用于计算相似度并返回相似度得分为3或更高的匹配项。 异常消息: 无效的列名“相似性”。 由于相似性不是真正的专栏文章,我将如何进行这项工作? 问题答案: 在查询的投影()阶段执行列别名和计算,该阶段在选择(和)阶段之后发生。因此,无法在子句或条件中引用它们,因为它们尚不存在。您可以将带有子句的查询用作子查询,也可以在子句中重复计