2014-11-18 6 views
43

मुझे आश्चर्य है कि इस विशिष्ट प्रश्न से पहले नहीं पूछा गया है, लेकिन मुझे वास्तव में यह SO12 और np.sort के दस्तावेज़ पर नहीं मिला। डिफ़ॉल्ट रूप सेअवरोही क्रम में एक numpy सरणी कुशलतापूर्वक सॉर्टिंग?

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

अगर मैं यह सॉर्ट, मैं आरोही मिल आदेश:

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

लेकिन मैं समाधान क्रमबद्ध करना चाहते

मैं एक यादृच्छिक numpy सरणी पकड़े पूर्णांकों, जैसे है कहो में आदेश अवरोही।

अब, मैं जानता हूँ कि मैं हमेशा कर सकते हैं:

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

लेकिन यह पिछले बयान कुशल है? क्या यह आरोही क्रम में एक प्रतिलिपि नहीं बनाता है, और फिर परिणाम को उलटा क्रम में प्राप्त करने के लिए इस प्रति को उलट देता है? यदि यह वास्तव में मामला है, तो क्या कोई कुशल विकल्प है? ऐसा लगता है कि np.sort विपरीत क्रम में चीजों को प्राप्त करने के लिए सॉर्ट ऑपरेशन में तुलना के संकेत को बदलने के लिए मानकों को स्वीकार करता है।

उत्तर

57

temp[::-1].sort() जगह में सरणी को टाइप करता है, np.sort(temp)[::-1] एक नया सरणी बनाएं।

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

धन्यवाद, लेकिन 'temp [:: - 1] .sort()' कैसे पता चलता है कि इसे रिवर्स ऑर्डर में सॉर्ट करना है ?? जिस तरह से मैंने इसे पढ़ा है वह है: मूल सरणी को उलट दें, और उसके बाद इसे क्रमबद्ध करें (आरोही क्रम में)। मूल सरणी (एक यादृच्छिक क्रम में आने) को फिर से क्यों घुमाएगा और फिर इसे आरोही क्रम में क्रमबद्ध करने से सरणी को रिवर्सिंग ऑर्डर में वापस कर दिया जाएगा? –

+5

क्या यह व्यवहार दस्तावेज है, क्योंकि यह बहुत ही अनूठा है। – ebarr

+0

मैंने देखा नहीं है लेकिन '[:: - 1]' अक्सर 'Argsort' –

5

कम सरणियों मैं हल कर अस्वीकृत सरणी, जो क्रमबद्ध सरणी पीछे की तुलना में थोड़ा तेज है के सूचकांकों का पता लगाकर np.argsort() उपयोग करने का सुझाव के लिए:

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

दुर्भाग्य से आप एक जटिल श्रृंखला है जब, केवल np.sort(temp)[::-1] ठीक से काम करता है। यहां वर्णित दो अन्य विधियां प्रभावी नहीं हैं।

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]) 
संबंधित मुद्दे