Temel olarak yapmanız gereken bir argsort
uygulama, 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 argsort
uygulanmasını
Emrinizde NumPy varsa, işlevi numpy.argsort
veya 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 argsort
diziyi 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
1
ve 1
orijinalde indeks içindedir, böylece sonucun ilk öğesi olur 1
.
2
İndeksi olan 2
sonucun ikinci unsurdur böylece orijinal 2
.
3
İndeksi olan 0
sonucun üçüncü unsurdur böylece orijinal 0
.
- En büyük değer
4
ve 3
orijinalde 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
3
büyük üçüncü değerdir, böylece 2
sıralanan dizide / listede dizinin ilk öğe olması gerekir 2
.
- orijinalin ikinci öğesi
1
, en küçük değerdir, böylece 0
sıralanan dizide / listede dizin olur, böylece ikinci öğe olur 0
.
- orijinalin üçüncü öğesi, en
2
küçük ikinci değerdir, bu nedenle 1
sıralanan dizi / listede dizin , böylece üçüncü öğe olur 1
.
- orijinalin dördüncü öğesi
4
en büyük değerdir, bu nedenle 3
sıralanan dizide / listede dizinin son öğe olması gerekir 3
.