Esencialmente necesitas hacer un argsort , qué implementación necesita depende si desea usar bibliotecas externas (por ejemplo, NumPy) o si desea permanecer en Python puro sin dependencias.
La pregunta que debe hacerse es: ¿quiere el
- índices que ordenarían la matriz / lista
- índices que los elementos tendrían en la matriz / lista ordenada
Desafortunadamente, el ejemplo en la pregunta no deja en claro lo que se desea porque ambos darán el mismo resultado:
>>> arr = np.array([1, 2, 3, 100, 5])
>>> np.argsort(np.argsort(arr))
array([0, 1, 2, 4, 3], dtype=int64)
>>> np.argsort(arr)
array([0, 1, 2, 4, 3], dtype=int64)
Elegir el argsort implementación
Si tiene NumPy a su disposición, simplemente puede usar la función numpy.argsorto el método numpy.ndarray.argsort.
Ya se mencionó una implementación sin NumPy en algunas otras respuestas, así que resumiré la solución más rápida de acuerdo con la respuesta de referencia aquí
def argsort(l):
return sorted(range(len(l)), key=l.__getitem__)
Obteniendo los índices que ordenarían la matriz / lista
Para obtener los índices que ordenarían la matriz / lista, simplemente puede llamar argsorta la matriz o lista. Estoy usando las versiones de NumPy aquí, pero la implementación de Python debería dar los mismos resultados
>>> arr = np.array([3, 1, 2, 4])
>>> np.argsort(arr)
array([1, 2, 0, 3], dtype=int64)
El resultado contiene los índices necesarios para obtener la matriz ordenada.
Dado que la matriz ordenada sería [1, 2, 3, 4]la matriz ordenada contiene los índices de estos elementos en el original.
- El valor más pequeño es
1y está en el índice 1del original, por lo que el primer elemento del resultado es 1.
- El
2está en el índice 2en el original, por lo que el segundo elemento del resultado es 2.
- El
3está en el índice 0en el original, por lo que el tercer elemento del resultado es 0.
- El valor más grande
4y está en el índice 3en el original, por lo que el último elemento del resultado es 3.
Obtener los índices que tendrían los elementos en la matriz / lista ordenada
En este caso, deberá aplicar argsort dos veces :
>>> arr = np.array([3, 1, 2, 4])
>>> np.argsort(np.argsort(arr))
array([2, 0, 1, 3], dtype=int64)
En este caso :
- el primer elemento del original es
3, que es el tercer valor más grande, por lo que tendría un índice 2en la matriz / lista ordenada, por lo que el primer elemento es2 .
- el segundo elemento del original es
1, que es el valor más pequeño, por lo que tendría un índice 0en la matriz / lista ordenada para que el segundo elemento sea0 .
- el tercer elemento del original es
2, que es el segundo valor más pequeño, por lo que tendría un índice 1en la matriz / lista ordenada para que el tercer elemento sea1 .
- el cuarto elemento del original es
4 cuál es el valor más grande, por lo que tendría un índice 3en la matriz / lista ordenada, por lo que el último elemento es 3.