Numpy neden bu sonucu veriyor:
x = numpy.array([1.48,1.41,0.0,0.1])
print x.argsort()
>[2 3 1 0]
bunu yapmasını beklediğimde:
[3 2 0 1]
Açıkçası, işleve ilişkin anlayışım eksik.
Numpy neden bu sonucu veriyor:
x = numpy.array([1.48,1.41,0.0,0.1])
print x.argsort()
>[2 3 1 0]
bunu yapmasını beklediğimde:
[3 2 0 1]
Açıkçası, işleve ilişkin anlayışım eksik.
Yanıtlar:
[2, 3, 1, 0]
en küçük elemanın dizin 2'de, bir sonraki en küçük elemanın dizin 3'te, sonra dizin 1, sonra dizin 0 olduğunu gösterir.
Orada birçok yolu aradığınız sonuç almak için:
import numpy as np
import scipy.stats as stats
def using_indexed_assignment(x):
"https://stackoverflow.com/a/5284703/190597 (Sven Marnach)"
result = np.empty(len(x), dtype=int)
temp = x.argsort()
result[temp] = np.arange(len(x))
return result
def using_rankdata(x):
return stats.rankdata(x)-1
def using_argsort_twice(x):
"https://stackoverflow.com/a/6266510/190597 (k.rooijers)"
return np.argsort(np.argsort(x))
def using_digitize(x):
unique_vals, index = np.unique(x, return_inverse=True)
return np.digitize(x, bins=unique_vals) - 1
Örneğin,
In [72]: x = np.array([1.48,1.41,0.0,0.1])
In [73]: using_indexed_assignment(x)
Out[73]: array([3, 2, 0, 1])
Bu, hepsinin aynı sonucu ürettiğini kontrol eder:
x = np.random.random(10**5)
expected = using_indexed_assignment(x)
for func in (using_argsort_twice, using_digitize, using_rankdata):
assert np.allclose(expected, func(x))
Bu IPython %timeit
karşılaştırmaları, büyük diziler using_indexed_assignment
için en hızlı olanıdır :
In [50]: x = np.random.random(10**5)
In [66]: %timeit using_indexed_assignment(x)
100 loops, best of 3: 9.32 ms per loop
In [70]: %timeit using_rankdata(x)
100 loops, best of 3: 10.6 ms per loop
In [56]: %timeit using_argsort_twice(x)
100 loops, best of 3: 16.2 ms per loop
In [59]: %timeit using_digitize(x)
10 loops, best of 3: 27 ms per loop
Küçük diziler using_argsort_twice
için daha hızlı olabilir:
In [78]: x = np.random.random(10**2)
In [81]: %timeit using_argsort_twice(x)
100000 loops, best of 3: 3.45 µs per loop
In [79]: %timeit using_indexed_assignment(x)
100000 loops, best of 3: 4.78 µs per loop
In [80]: %timeit using_rankdata(x)
100000 loops, best of 3: 19 µs per loop
In [82]: %timeit using_digitize(x)
10000 loops, best of 3: 26.2 µs per loop
Ayrıca, bunun stats.rankdata
size eşit değere sahip öğelerin nasıl işleneceği konusunda daha fazla kontrol sağladığını unutmayın.
argsort
sıralanan dizinin indislerini döndürür. Sıralanan endekslerin dizini sıralamadır. Geri argsort
dönmek için ikinci çağrı budur .
Gibi belgeler diyor argsort
:
Bir diziyi sıralayacak dizinleri döndürür.
Bu, argsort'un ilk öğesinin, ilk sıralanması gereken öğenin dizini olduğu, ikinci öğenin, ikinci olması gereken öğenin dizin olduğu anlamına gelir.
İstediğiniz gibi görünen şey, değerlerin sıralamasıdır, bu da tarafından sağlanır scipy.stats.rankdata
. Saflarda bağlar varsa ne olması gerektiğini düşünmeniz gerektiğini unutmayın.
numpy.argsort (a, axis = -1, tür = 'hızlı sıralama', sıra = Yok)
Bir diziyi sıralayacak indisleri verir
Kind anahtar sözcüğü ile belirtilen algoritmayı kullanarak verilen eksen boyunca dolaylı bir sıralama gerçekleştirin. Belirtilen eksen boyunca sıralı bir şekilde, dizin verileriyle aynı şekle sahip bir dizi dizin döndürür.
Bir değer listesi olan python'da bir örnek düşünün.
listExample = [0 , 2, 2456, 2000, 5000, 0, 1]
Şimdi argsort işlevini kullanıyoruz:
import numpy as np
list(np.argsort(listExample))
Çıktı olacak
[0, 5, 6, 1, 3, 2, 4]
Bu, listExample'daki değerlerin indekslerinin listesidir. Bu indisleri ilgili değerlerle eşlerseniz, sonucu şu şekilde alacağız:
[0, 0, 1, 2, 2000, 2456, 5000]
(Bu işlevi pek çok yerde çok yararlı buluyorum, örneğin, liste / diziyi sıralamak istiyor ancak list.sort () işlevini kullanmak istemiyorsanız (yani listedeki gerçek değerlerin sırasını değiştirmeden) bunu kullanabilirsiniz. işlev.)
Daha fazla ayrıntı için şu bağlantıya bakın: https://docs.scipy.org/doc/numpy-1.15.0/reference/generated/numpy.argsort.html
input:
np
x = np.array ([1.48,1.41,0.0,0.1])
x.argsort (). argsort () olarak numpy içe aktar
çıktı:
dizi ([3, 2, 0, 1])
İlk olarak, dizi sipariş edildi. Ardından, dizinin ilk diziniyle bir dizi oluşturun.
Sadece OP'nin orijinal anlayışını gerçek uygulama ile kod ile doğrudan karşılaştırmak istiyorum.
numpy.argsort
1 boyutlu diziler için:
x[x.argsort()] == numpy.sort(x) # this will be an array of True's
OP başlangıçta 1D dizileri için şu şekilde tanımlandığını düşündü:
x == numpy.sort(x)[x.argsort()] # this will not be True
Not: Bu kod genel durumda çalışmaz (yalnızca 1D için çalışır), bu yanıt tamamen örnekleme amaçlıdır.
x[x.argsort()]
ile aynı olmak zorunda değildir np.sort(x)
. Aslında, aynı şekilde olması bile gerekmez. Bunu bir 2B diziyle deneyin. Bu yalnızca 1D dizilerle çalışır.
[3 2 0 1]
doğru cevap olacağını düşündün ?