Estoy buscando una manera eficiente de calcular el vector de rango de una lista en Python, similar a la función de R rank
. En una lista simple sin vínculos entre los elementos, elemento i del vector de rango de una lista l
debe ser x si y sólo si l[i]
es el elemento -ésimo x en la lista ordenada. Esto es simple hasta el momento, el siguiente fragmento de código hace el truco:Método eficiente para calcular el vector de rango de una lista en Python
def rank_simple(vector):
return sorted(range(len(vector)), key=vector.__getitem__)
las cosas se complican, sin embargo, si la lista original tiene lazos (es decir, múltiples elementos con el mismo valor). En ese caso, todos los elementos que tengan el mismo valor deberían tener el mismo rango, que es el promedio de sus rangos obtenidos usando el método ingenuo anterior. Entonces, por ejemplo, si tengo [1, 2, 3, 3, 3, 4, 5]
, el ranking ingenuo me da [0, 1, 2, 3, 4, 5, 6]
, pero lo que me gustaría tener es [0, 1, 3, 3, 3, 5, 6]
. ¿Cuál sería la forma más eficiente de hacer esto en Python?
Nota al pie: No sé si NumPy ya tiene un método para lograr esto o no; si lo hace, hágamelo saber, pero de todos modos estaría interesado en una solución pura de Python, ya que estoy desarrollando una herramienta que también debería funcionar sin NumPy.
¿Ha comprobado 'numpy.argsort (vector)'? –