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.argsort
o 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 argsort
a 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
1
y está en el índice 1
del original, por lo que el primer elemento del resultado es 1
.
- El
2
está en el índice 2
en el original, por lo que el segundo elemento del resultado es 2
.
- El
3
está en el índice 0
en el original, por lo que el tercer elemento del resultado es 0
.
- El valor más grande
4
y está en el índice 3
en 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 2
en 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 0
en 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 1
en 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 3
en la matriz / lista ordenada, por lo que el último elemento es 3
.