ndarray-গুলো ইন্ডেক্স করা যায় স্ট্যান্ডার্ড পাইথন x[obj] সিনট্যাক্স ব্যবহার করে, যেখানে x হলো অ্যারে এবং obj হলো সিলেকশন।
তিন ধরনের ইন্ডেক্সিং উপলব্ধ:
- ফিল্ড এক্সেস (field access)
- বেসিক স্লাইসিং (basic slicing)
- অ্যাডভান্সড ইন্ডেক্সিং (advanced indexing)
কোন ধরনের ইন্ডেক্সিং হবে সেটা obj-র উপর নির্ভর করে। এই সেকশনে আমরা মূলত বেসিক স্লাইসিং এবং অ্যাডভান্সড ইন্ডেক্সিং-র ওপর ফোকাস করব।
অ্যাডভান্সড ইন্ডেক্সিং দুভাগে ভাগ করা যায়:
- ইন্টিজার অ্যারে ইন্ডেক্সিং (Integer array indexing)
- বুলিয়ান ইন্ডেক্সিং (Boolean indexing)
বেসিক স্লাইসিং (Basic Slicing)
পাইথনের স্লাইসিং এর মৌলিক কনসেপ্ট n-ডাইমেনশনে বেসিক স্লাইসিং-এ প্রসারিত। পাইথন স্লাইস অবজেক্ট যেটি slice ফাংশনে start, stop ও step প্যারামিটার দিয়ে কনস্ট্রাক্ট করা হয়। নির্দিষ্ট আউটপুট পেতে, স্লাইস অবজেক্টটি অ্যারেয়ে পাস করা হয় অ্যারের একটি অংশ এক্সট্রাক্ট করার জন্য।
উদাহরণ ১
import numpy as np arr = np.arange(25) s = slice(2, 21, 4) print(arr[s])
আউটপুট
[ 2 6 10 14 18]
উপরের উদাহরণে, আমরা প্রথমে arange() ফাংশন ব্যবহার করে একটি ndarray অবজেক্ট (arr) তৈরি করলাম। তারপর একটি স্লাইস অবজেক্ট তৈরি করলাম start, stop এবং step ভ্যালু অ্যাসাইন করে (s)। স্লাইস অবজেক্টটি ndarray-এ পাস করলে আমরা অ্যারের একটি অংশ (slice) পাই যা ইনডেক্স ২ থেকে শুরু হয় ২১ পর্যন্ত ৪ স্টেপ নিয়ে।
উপরের প্রোগ্রামটি লেখার আরেকটি পদ্ধতি:
# উপরের প্রোগ্রাম লেখার আরেকটি পদ্ধতি import numpy as np arr = np.arange(25) s = arr[2:21:4] print(s)
আউটপুট
[ 2 6 10 14 18]
সিঙ্গেল আইটেম স্লাইস করা (Slice single item)
# অ্যারে থেকে সিঙ্গেল আইটেম স্লাইস import numpy as np arr = np.arange(10) s = arr[9] print(s)
আউটপুট
9
ইন্ডেক্স থেকে শুরু করে আইটেম স্লাইস করা (Slice items starting from index)
# ইন্ডেক্স থেকে শুরু করে আইটেম স্লাইস import numpy as np arr = np.arange(10) s = arr[3:] print(s)
আউটপুট
[3 4 5 6 7 8 9]
দুই ইন্ডেক্সের মাঝপথের আইটেম স্লাইস করা (Slice item between indexes)
# দুটি ইন্ডেক্সের মাঝপথের আইটেম স্লাইস import numpy as np arr = np.arange(10) s = arr[3:7] print(s)
আউটপুট
[3 4 5 6]
উপরের দুটি মেথড 멀্টি-ডাইমেনশনাল ndarray-ও প্রয়োগ করা যায়, নিচের মতো:
# দুটি ইন্ডেক্সের মাঝপথের আইটেম স্লাইস import numpy as np arr = np.array([[[1],[2],[3]], [[4],[5],[6]], [[7], [8], [9]]]) s = arr[1:] print(s)
আউটপুট
[[[4] [5] [6]] [[7] [8] [9]]]
অ্যাডভান্সড ইন্ডেক্সিং (Advanced indexing)
ইন্টিজার অ্যারে ইন্ডেক্সিং (Integer array indexing):
চলুন ইন্টিজার দিয়ে একটি সিম্পল অ্যারে তৈরি করি:
arr = np.array([[1,2],[3,4],[5,6]]) print(arr)
আউটপুট
[[1 2] [3 4] [5 6]]
চলুন অ্যারের একটি নির্দিষ্ট এলিমেন্ট সিলেক্ট করার চেষ্টা করি, যেমন - মাল্টি-ডাইমেনশনাল ndarray থেকে রো ইন্ডেক্স [0, 1, 2] এবং কলাম ইন্ডেক্স [1, 0, 1] দিয়ে এলিমেন্ট সিলেক্ট করা।
import numpy as np arr = np.array([[1,2],[3,4],[5,6]]) s = arr[[0, 1, 2], [1, 0, 1]] print(s)
আউটপুট
[2 3 6]
০ ইন্ডেক্স দিয়ে সিলেক্ট করলে প্রথম রো পাওয়া যাবে:
>>> arr = np.array([[1,2],[3,4],[5,6]]) >>> print(arr[0]) [1 2]
এভাবেই অ্যারে থেকে একটি সিঙ্গেল আইটেম সিলেক্ট করা যায়, উদাহরণস্বরূপ - ১ রো ইন্ডেক্স এবং ১ কলাম ইন্ডেক্স এলিমেন্ট সিলেক্ট করলে অ্যারে ভ্যালু ৪ পাওয়া যাবে।
>>> print(arr[[1], [1]]) [4]
আমরা অ্যারের একটি নির্দিষ্ট ইন্ডেক্সের ভ্যালু যোগ করে (addition) রিটার্ন করতে পারি।
>>> print(arr[[1], [1]] + 1) [5]
দেখা যাচ্ছে ইন্ডেক্স ভ্যালু ১ বাড়েছে কিন্তু আসল অ্যারে অপরিবর্তিত থাকে।
>>> arr
array([[1, 2],
[3, 4],
[5, 6]])
তবে আমরা অ্যারের ভ্যালু পরিবর্তন করে অ্যারের নতুন কপি রিটার্ন করতে পারি।
>>> arr[[1], [1]] += 1
>>> arr
array([[1, 2],
[3, 5],
[5, 6]])
বুলিয়ান ইন্ডেক্সিং (Boolean indexing)
বুলিয়ান ইন্ডেক্সিং আমরা তখন ব্যবহার করি যখন ফলাফল বুলিয়ান অপারেশনের ফলাফল হবে।
>>> arr = np.array([[0,1,2], [3,4,5], [6,7,8], [9,10,11]])
>>> arr
array([[ 0, 1, 2],
[ 3, 4, 5],
[ 6, 7, 8],
[ 9, 10, 11]])
যেসব ভ্যালু ১ সেগুলো রিটার্ন করবে:
>>> arr[arr == 1] array([1])
যেসব ভ্যালু জোড় সংখ্যা (even numbers) সেগুলো রিটার্ন করবে:
>>> arr[arr % 2 == 0] array([ 0, 2, 4, 6, 8, 10])