我希望能够在Python中高效地计算列表的排名向量,类似于R语言的rank
函数。在没有元素之间存在平局的简单列表中,列表l
的排名向量的第i个元素应为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也能工作的工具。
numpy.argsort(vector)
吗? - yosemite_krank_simple()
实际上是R语言中order()
函数的等价物,而不是rank()
函数吗?例如,请参见https://dev59.com/02ct5IYBdhLWcg3wLqfw。 - djvg