আপনি যদি কোনও অ্যারে অবহেলা করেন তবে সর্বনিম্ন উপাদানগুলি সর্বোচ্চ উপাদান এবং তদ্বিপরীত হয়ে ওঠে। সুতরাং, n
সর্বোচ্চ উপাদানগুলির সূচকগুলি হ'ল :
(-avgDists).argsort()[:n]
এই সম্পর্কে কারণ আরেকটি উপায়, যেমন উল্লেখ মন্তব্য , পর্যবেক্ষণ করতে যে বড় উপাদান আসছে হয় গত argsort হবে। সুতরাং, আপনি n
সর্বোচ্চ উপাদানগুলি খুঁজে পেতে আর্গোর্টের লেজ থেকে পড়তে পারেন :
avgDists.argsort()[::-1][:n]
উভয় পদ্ধতি হ'ল সময় জটিলতায় ও (এন লগ এন) , কারণ argsort
কলটি এখানে প্রধান প্রভাবশালী শব্দ। তবে দ্বিতীয় পদ্ধতির একটি দুর্দান্ত সুবিধা রয়েছে: এটি অ্যারের একটি ও (এন) উপকারের পরিবর্তে একটি ও (1) ফালি দিয়ে প্রতিস্থাপন করে । আপনি যদি লুপের অভ্যন্তরে ছোট অ্যারে নিয়ে কাজ করছেন তবে আপনি সেই প্রত্যাখ্যান এড়ানো থেকে কিছুটা পারফরম্যান্স লাভ পেতে পারেন এবং যদি আপনি বিশাল অ্যারে নিয়ে কাজ করছেন তবে আপনি মেমরির ব্যবহারে সঞ্চয় করতে পারবেন কারণ প্রত্যাখ্যান পুরো অ্যারের একটি অনুলিপি তৈরি করে।
নোট করুন যে এই পদ্ধতিগুলি সর্বদা সমতুল্য ফলাফল দেয় না: যদি কোনও স্থিতিশীল সাজানোর প্রয়োগের জন্য অনুরোধ করা হয় 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)
বৃহত্তর অ্যারেগুলির জন্য, আর্গোর্টটি প্রভাবশালী এবং কোনও উল্লেখযোগ্য সময় পার্থক্য নেই
>>> 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)
দয়া করে নোট করুন যে নীচে নেডিমের মন্তব্যটি ভুল। বিপরীত হওয়ার আগে বা পরে ছাঁটাই করা হবে কিনা তা দক্ষতার কোনও পার্থক্য নেই, কারণ এই উভয়ই ক্রিয়াকলাপ অ্যারের একটি দৃষ্টিভঙ্গি কেবল আলাদাভাবে চালিয়ে যাচ্ছে এবং আসলে ডেটা অনুলিপি করছে না।
ids = np.array(avgDists).argsort()[-n:]
?