2014-11-18 25 views
43

Ben bu özel soru daha önce talebinde bulunulmadığını şaşırıyorum, ama gerçekten SO ne de np.sort dökümanlarına bulamadık. varsayılan olarak bunu sıralamak EğerSayısal diziyi azalan sırada verimli bir şekilde mi sıralıyorsunuz?

> temp = np.random.randint(1,10, 10)  
> temp 
array([2, 4, 7, 4, 2, 2, 7, 6, 4, 4]) 

, ben artan olsun sipariş:

> np.sort(temp) 
array([2, 2, 2, 4, 4, 4, 4, 6, 7, 7]) 

ama çözüm sıralanmasını istediğiniz

Ben rastgele numpy dizi tutan tamsayılar, örneğin var ki azalan sipariş.

Şimdi, hep yapmak biliyorum:

reverse_order = np.sort(temp)[::-1] 

ama bu son açıklama etkilidir? Artan sırayla bir kopya oluşturmuyor ve sonucu ters sırayla almak için bu kopyayı tersine çevirmiyor mu? Bu durum gerçekten geçerliyse, verimli bir alternatif var mı? np.sort, sıralamayı ters sırada almak için sıralama işlemindeki karşılaştırmaların işaretini değiştirmek için parametreler kabul etmez.

cevap

57

temp[::-1].sort() yerde diziyi sıralar np.sort(temp)[::-1] yeni bir dizi oluşturmak. Ben sıralanmış bir dizide tersine biraz daha hızlıdır sıralanmış negatived dizinin, indeksleri bularak np.argsort() kullanmanızı öneririz kısa diziler için

In [25]: temp = np.random.randint(1,10, 10) 

In [26]: temp 
Out[26]: array([5, 2, 7, 4, 4, 2, 8, 6, 4, 4]) 

In [27]: id(temp) 
Out[27]: 139962713524944 

In [28]: temp[::-1].sort() 

In [29]: temp 
Out[29]: array([8, 7, 6, 5, 4, 4, 4, 4, 2, 2]) 

In [30]: id(temp) 
Out[30]: 139962713524944 
+5

Teşekkürler, ama nasıl bir temp [:: - 1] .sort() 'ters sıralamak zorunda olduğunu biliyor mu? Okuduğum yol: orijinal diziyi tersine çevir ve sonra (artan düzende). Orijinal diziyi (rastgele bir sırayla) tersine çevirmek ve sonra artan sıraya göre sıralamak neden diziyi ters sırayla döndürür? –

+5

Bu davranış, oldukça mantıksız olduğu için belgelendi. – ebarr

+0

gördüğüm ama '[:: - 1] değil o' sıklıkla kullanılır 'sıralama zamanı, operasyon alıcı toplam zamanın çok küçük bir kısmını alacak kadar büyük olursa olsun, bir dizi geri olduğunu –

5

: Maalesef

In [37]: temp = np.random.randint(1,10, 10) 

In [38]: %timeit np.sort(temp)[::-1] 
100000 loops, best of 3: 4.65 µs per loop 

In [39]: %timeit temp[np.argsort(-temp)] 
100000 loops, best of 3: 3.91 µs per loop 
-1

, karmaşık dizi var, sadece np.sort(temp)[::-1] düzgün çalışıyor. Burada belirtilen diğer iki yöntem etkili değildir.

4
>>> a=np.array([5, 2, 7, 4, 4, 2, 8, 6, 4, 4]) 

>>> np.sort(a) 
array([2, 2, 4, 4, 4, 4, 5, 6, 7, 8]) 

>>> -np.sort(-a) 
array([8, 7, 6, 5, 4, 4, 4, 4, 2, 2]) 
İlgili konular