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 argsort
Implementierung
Wenn Sie NumPy zur Verfügung haben, können Sie einfach die Funktion numpy.argsort
oder 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 argsort
das 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
1
und befindet sich am Index 1
im Original, sodass das erste Element des Ergebnisses ist1
.
- Das
2
ist 2
im Original im Index, also ist das zweite Element des Ergebnisses 2
.
- Das
3
ist 0
im Original im Index, also ist das dritte Element des Ergebnisses 0
.
- Der größte Wert
4
und der Index 3
im 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
3
der drittgrößte Wert, sodass es einen Index 2
im sortierten Array / der sortierten Liste hat, also das erste Element 2
.
- Das zweite Element des Originals ist
1
der kleinste Wert, sodass es einen Index 0
im sortierten Array / der sortierten Liste hat, also das zweite Element 0
.
- Das dritte Element des Originals ist
2
der zweitkleinste Wert, sodass es einen Index 1
im sortierten Array / der sortierten Liste hat, also das dritte Element 1
.
- Das vierte Element des Originals ist
4
der größte Wert, sodass es einen Index 3
im sortierten Array / der sortierten Liste hat, also das letzte Element 3
.