Temel olarak yapmanız gereken bir argsortuygulama, harici kütüphaneleri (örneğin NumPy) kullanmak veya bağımlılık olmadan saf Python'da kalmak isteyip istemediğinize bağlıdır.
Kendinize sormanız gereken soru şudur:
- diziyi / listeyi sıralayan dizinler
- öğelerin sıralı dizide / listede bulunacağı dizinler
Maalesef sorudaki örnek, neyin arzu edildiğini netleştirmiyor çünkü her ikisi de aynı sonucu verecek:
>>> 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)
seçimi argsortuygulanmasını
Emrinizde NumPy varsa, işlevi numpy.argsortveya yöntemi kullanabilirsiniz numpy.ndarray.argsort.
NumPy içermeyen bir uygulama zaten diğer bazı cevaplarda belirtildi, bu yüzden burada kıyaslama cevabına göre en hızlı çözümü özetleyeceğim.
def argsort(l):
return sorted(range(len(l)), key=l.__getitem__)
Diziyi / listeyi sıralayacak dizinleri alma
Diziyi / listeyi sıralayacak dizinleri almak için argsortdiziyi veya listeyi arayabilirsiniz . Burada NumPy sürümleri kullanıyorum ama Python uygulaması aynı sonuçları vermelidir
>>> arr = np.array([3, 1, 2, 4])
>>> np.argsort(arr)
array([1, 2, 0, 3], dtype=int64)
Sonuç, sıralı diziyi almak için gereken dizinleri içerir.
Sıralanan dizi olacağı için [1, 2, 3, 4], argsorted dizi orijinalde bu öğelerin dizinlerini içerir.
- En küçük değer
1ve 1orijinalde indeks içindedir, böylece sonucun ilk öğesi olur 1.
2İndeksi olan 2sonucun ikinci unsurdur böylece orijinal 2.
3İndeksi olan 0sonucun üçüncü unsurdur böylece orijinal 0.
- En büyük değer
4ve 3orijinalde indeks içindedir, böylece sonucun son öğesi olur 3.
Öğelerin sıralı dizide / listede bulunacağı dizinleri alma
Bu durumda argsort iki kez başvurmanız gerekir :
>>> arr = np.array([3, 1, 2, 4])
>>> np.argsort(np.argsort(arr))
array([2, 0, 1, 3], dtype=int64)
Bu durumda :
- orijinalin ilk öğesi, en
3büyük üçüncü değerdir, böylece 2sıralanan dizide / listede dizinin ilk öğe olması gerekir 2.
- orijinalin ikinci öğesi
1, en küçük değerdir, böylece 0sıralanan dizide / listede dizin olur, böylece ikinci öğe olur 0.
- orijinalin üçüncü öğesi, en
2küçük ikinci değerdir, bu nedenle 1sıralanan dizi / listede dizin , böylece üçüncü öğe olur 1.
- orijinalin dördüncü öğesi
4en büyük değerdir, bu nedenle 3sıralanan dizide / listede dizinin son öğe olması gerekir 3.