Я ищу эффективный способ вычисления рангового вектора списка в Python, аналогичном функции R rank
. В простом списке без связей между элементами элемент я ранга-вектора списка 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.