ডেটা এলিমেন্টগুলো নির্দিষ্ট ক্রমে সাজানো (সোর্ট করা) একটি প্রায়ই প্রয়োজনীয় অপারেশন। অ্যারেতে এলিমেন্ট সোর্ট করতে পাইথন sorted() এবং array.sort() ফাংশন ব্যবহার করে।
sorted(array)
এই ফাংশন একটি সোর্টেড অ্যারে রিটার্ন করে অরিজিনাল অ্যারে মডিফাই না করে।
a = [9, 5, 3, 1, 12, 6]
b = sorted([9, 5, 3, 1, 12, 6])
print("Sorted Array:\n", b)
print("Original Array:\n", a)আউটপুট:
Sorted Array: [1, 3, 5, 6, 9, 12] Original Array: [9, 5, 3, 1, 12, 6]
list.sort()
sort ফাংশন ইন-প্লেস মডিফিকেশন করেই সোর্টেড অ্যারে রিটার্ন করে। তাই অরিজিনাল অ্যারে মডিফাই হয়ে যায়।
a = [9, 5, 3, 1, 12, 6]
print("Original Array:\n", a)
print("Sorted Array:\n")
a.sort()
print(a)আউটপুট:
Original Array: [9, 5, 3, 1, 12, 6] Sorted Array: [1, 3, 5, 6, 9, 12]
তাই sorted() ফাংশন sort()-এর চেয়ে স্লোয়ার কারণ এটি অরিজিনাল অ্যারে কপি করে তারপর মডিফাই করে।
জটিল সোর্টিং রিকোয়ারমেন্টের জন্য NumPy ব্যবহার করা হয়। NumPy একটি পাইথন লাইব্রেরি যা বিজ্ঞানী ডেটা প্রসেসিং-এ ব্যাপকভাবে ব্যবহৃত হয় কারণ এতে অনেক অ্যাডভান্সড ফিচার রয়েছে। নিচে পিউর পাইথন এবং NumPy সোর্টিং মেথড দুটোই দেখানো হলো।
numpy.argsort
NumPy-এ এই ফাংশন সোর্টেড অ্যারের ইনডেক্সগুলো রিটার্ন করে, এলিমেন্টগুলো না। নিচের উদাহরণে আমরা অ্যারেটি নিলাম, এর এলিমেন্ট এবং প্রতিটি এলিমেন্টের ইনডেক্স প্রিন্ট করলাম। তারপর argsort ফাংশন প্রয়োগ করলাম যা সোর্টেড এলিমেন্টের ইনডেক্সগুলো রিটার্ন করে এবং রেজাল্টও একটি অ্যারে।
import numpy as np
x = np.array([9, 5, 3, 1, 12, 6])
print(x)
# এলিমেন্টের পজিশন প্রিন্ট
for i in range(len(x)):
print("[", i, "]", x[i])
print("\n")
# সোর্টেড এলিমেন্টের ইনডেক্স প্রিন্ট
s = np.argsort(x)
print(s)আউটপুট:
[9 5 3 1 12 6] [ 0 ] 9 [ 1 ] 5 [ 2 ] 3 [ 3 ] 1 [ 4 ] 12 [ 5 ] 6 [3 2 1 5 0 4]
numpy.lexsort
এই ফাংশন একাধিক সোর্ট কি (sort keys) ব্যবহার করে সোর্টিং করার জন্য যেখানে একাধিক অ্যারে জড়িত থাকে। উদাহরণস্বরূপ, আমরা প্রথম কলাম A-র ডেটা সোর্ট করি এবং তারপর কলাম B-র ভ্যালু সোর্ট করি। নিচের উদাহরণে আমরা দুটি অ্যারে নিলাম কলাম A এবং কলাম B রিপ্রেজেন্ট করে। lexsort() ফাংশন প্রয়োগ করে প্রথম কলাম A দিয়ে এবং তারপর কলাম B দিয়ে সোর্ট করলে সোর্টিংয়ের রেজাল্ট ইনডেক্সের একটি অ্যারে আকারে আসে।
import numpy as np colA = [2, 5, 1, 8, 1] # প্রথম কলাম colB = [9, 0, 3, 2, 0] // দ্বিতীয় কলাম # ColA দিয়ে সোর্ট এবং তারপর colB দিয়ে সোর্ট sorted_index = np.lexsort((colB, colA)) print(sorted_index) # রেজাল্ট প্রিন্ট করুন কলাম ভ্যালু পেয়ার হিসেবে print([(colA[i], colB[i]) for i in sorted_index])
আউটপুট:
[4 2 0 1 3] [(1, 0), (1, 3), (2, 9), (5, 0), (8, 2)]
আপনি দেখতে পাচ্ছেন colA-র ন্যূনতম দুটি ভ্যালু ১ এবং ১ ইনডেক্স পজিশন ২ এবং ৪-এ। কিন্তু রেজাল্টে ৪ এবং ২ আসেনডিং আকারে দেখাচ্ছে কারণ কলাম B-র সংশ্লিষ্ট ভ্যালু ০ এবং ৩ সোর্টেড হয়েছে প্রথম ০ তারপর ৩, তাই রেজাল্ট ৪ এবং ২।