यदि आप किसी सरणी को नकारते हैं, तो निम्नतम तत्व उच्चतम तत्व बन जाते हैं और इसके विपरीत। इसलिए, n
उच्चतम तत्वों के सूचक हैं:
(-avgDists).argsort()[:n]
इसके बारे में एक और तरीका, जैसा कि टिप्पणियों में बताया गया है , निरीक्षण करना है कि बड़े तत्व आर्गन्स में अंतिम आ रहे हैं । तो, आप n
उच्चतम तत्वों को खोजने के लिए आर्गन्स की पूंछ से पढ़ सकते हैं :
avgDists.argsort()[::-1][:n]
दोनों विधियाँ समय जटिलता में ओ (एन लॉग एन) हैं , क्योंकि argsort
कॉल यहां प्रमुख शब्द है। लेकिन दूसरे दृष्टिकोण का एक अच्छा लाभ है: यह O (1) स्लाइस के साथ सरणी के O (n) नकार को प्रतिस्थापित करता है । यदि आप छोरों के अंदर छोटे सरणियों के साथ काम कर रहे हैं, तो आपको उस नकारात्मकता से बचने से कुछ प्रदर्शन लाभ मिल सकते हैं, और यदि आप विशाल सरणियों के साथ काम कर रहे हैं, तो आप मेमोरी उपयोग पर बचत कर सकते हैं क्योंकि नकार पूरे सरणी की एक प्रति बनाता है।
ध्यान दें कि ये विधियाँ हमेशा समान परिणाम नहीं देती हैं: यदि स्थिर argsort
तर्क को लागू करने का अनुरोध किया जाता है , जैसे कि कीवर्ड तर्क को पारित करके kind='mergesort'
, तो पहली रणनीति छँटाई स्थिरता को बनाए रखेगी, लेकिन दूसरी रणनीति स्थिरता को तोड़ देगी (अर्थात समान पदों को आइटम उलट हो जाएंगे)।
उदाहरण समय:
100 फ़्लोट्स की एक छोटी सरणी और 30 पूंछ की लंबाई का उपयोग करते हुए, दृश्य विधि लगभग 15% तेज थी
>>> avgDists = np.random.rand(100)
>>> n = 30
>>> timeit (-avgDists).argsort()[:n]
1.93 µs ± 6.68 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
>>> timeit avgDists.argsort()[::-1][:n]
1.64 µs ± 3.39 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
>>> timeit avgDists.argsort()[-n:][::-1]
1.64 µs ± 3.66 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
बड़े सरणियों के लिए, argort प्रमुख है और कोई महत्वपूर्ण समय अंतर नहीं है
>>> avgDists = np.random.rand(1000)
>>> n = 300
>>> timeit (-avgDists).argsort()[:n]
21.9 µs ± 51.2 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
>>> timeit avgDists.argsort()[::-1][:n]
21.7 µs ± 33.3 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
>>> timeit avgDists.argsort()[-n:][::-1]
21.9 µs ± 37.1 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
कृपया ध्यान दें कि नीचे nedim की टिप्पणी गलत है। उलटने से पहले या बाद में छंटनी करना दक्षता में कोई अंतर नहीं रखता है, क्योंकि ये दोनों ऑपरेशन केवल सरणी के दृश्य को अलग-अलग तरीके से दिखा रहे हैं और वास्तव में डेटा की प्रतिलिपि नहीं बना रहे हैं।
ids = np.array(avgDists).argsort()[-n:]
?