Im Wesentlichen müssen Sie eine durchführen argsort. Welche Implementierung Sie benötigen, hängt davon ab, ob Sie externe Bibliotheken (z. B. NumPy) verwenden möchten oder ob Sie Pure-Python ohne Abhängigkeiten bleiben möchten.
Die Frage, die Sie sich stellen müssen, lautet: Wollen Sie die
- Indizes, die das Array / die Liste sortieren würden
- Indizes, die die Elemente im sortierten Array / in der sortierten Liste haben würden
Leider macht das Beispiel in der Frage nicht klar, was gewünscht wird, da beide das gleiche Ergebnis liefern:
>>> 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)
Auswahl der argsortImplementierung
Wenn Sie NumPy zur Verfügung haben, können Sie einfach die Funktion numpy.argsortoder Methode verwendennumpy.ndarray.argsort .
Eine Implementierung ohne NumPy wurde bereits in einigen anderen Antworten erwähnt, daher werde ich hier nur die schnellste Lösung gemäß der Benchmark-Antwort zusammenfassen
def argsort(l):
return sorted(range(len(l)), key=l.__getitem__)
Abrufen der Indizes, die das Array / die Liste sortieren würden
Um die Indizes zu erhalten, die das Array / die Liste sortieren würden, können Sie einfach argsortdas Array oder die Liste aufrufen . Ich verwende hier die NumPy-Versionen, aber die Python-Implementierung sollte die gleichen Ergebnisse liefern
>>> arr = np.array([3, 1, 2, 4])
>>> np.argsort(arr)
array([1, 2, 0, 3], dtype=int64)
Das Ergebnis enthält die Indizes, die zum Abrufen des sortierten Arrays erforderlich sind.
Da das sortierte Array [1, 2, 3, 4]das argsortierte Array wäre, enthält es die Indizes dieser Elemente im Original.
- Der kleinste Wert ist
1und befindet sich am Index 1im Original, sodass das erste Element des Ergebnisses ist1 .
- Das
2ist 2im Original im Index, also ist das zweite Element des Ergebnisses 2.
- Das
3ist 0im Original im Index, also ist das dritte Element des Ergebnisses 0.
- Der größte Wert
4und der Index 3im Original, also das letzte Element des Ergebnisses 3.
Abrufen der Indizes, die die Elemente im sortierten Array / in der sortierten Liste haben würden
In diesem Fall müssten Sie sich argsort zweimal bewerben :
>>> arr = np.array([3, 1, 2, 4])
>>> np.argsort(np.argsort(arr))
array([2, 0, 1, 3], dtype=int64)
In diesem Fall :
- Das erste Element des Originals ist
3der drittgrößte Wert, sodass es einen Index 2im sortierten Array / der sortierten Liste hat, also das erste Element 2.
- Das zweite Element des Originals ist
1der kleinste Wert, sodass es einen Index 0im sortierten Array / der sortierten Liste hat, also das zweite Element 0.
- Das dritte Element des Originals ist
2der zweitkleinste Wert, sodass es einen Index 1im sortierten Array / der sortierten Liste hat, also das dritte Element 1.
- Das vierte Element des Originals ist
4der größte Wert, sodass es einen Index 3im sortierten Array / der sortierten Liste hat, also das letzte Element 3.