ভূমিকা
NumPy (Numerical Python) হলো পাইথনের একটি অত্যন্ত শক্তিশালী লাইব্রেরি যা মূলত সায়েন্টিফিক কম্পিউটিং, ডেটা সায়েন্স, এবং মেশিন লার্নিংয়ের জন্য ব্যবহৃত হয়। এটি মূলত এন-ডাইমেনশনাল অ্যারে (n-dimensional arrays) প্রসেসিং এবং অ্যাডভান্সড ম্যাথমেটিকাল ক্যালকুলেশনের জন্য তৈরি করা হয়েছে।
পাইথন লিস্ট বনাম NumPy অ্যারে: পারফরম্যান্স (Performance compared to Python lists)
অনেকের মনেই প্রশ্ন জাগতে পারে যে, পাইথনে তো আগে থেকেই লিস্ট (List) রয়েছে, তাহলে NumPy অ্যারের কী দরকার? এর প্রধান কারণ হলো পারফরম্যান্স। পাইথনের সাধারণ লিস্টের তুলনায় NumPy অ্যারে অনেক বেশি দ্রুত এবং কম মেমরি ব্যবহার করে।
- মেমরি অ্যালোকেশন: পাইথনের লিস্টে প্রতিটি উপাদানের জন্য আলাদা মেমরি ব্লক এবং পয়েন্টার থাকে, কারণ লিস্ট বিভিন্ন ধরনের ডেটা টাইপ ধারণ করতে পারে। কিন্তু NumPy অ্যারে সমজাতীয় (homogeneous) ডেটা ধারণ করে এবং কন্টিন্যুয়াস মেমরি ব্লকে ডেটা সংরক্ষণ করে, যা ডেটা রিড ও রাইট করা দ্রুত করে।
- সি ল্যাঙ্গুয়েজের ব্যবহার: NumPy-এর মূল অংশগুলো C ল্যাঙ্গুয়েজে লেখা হয়েছে। ফলে পাইথনের গ্লোবাল ইন্টারপ্রেটার লক (GIL) এর সীমাবদ্ধতা এড়িয়ে এটি সরাসরি মেমরি অ্যাক্সেস করে দ্রুত কাজ করতে পারে।
ইনস্টলেশন ও ইম্পোর্ট
NumPy ব্যবহার করার আগে এটি ইনস্টল করে নিতে হবে। টার্মিনাল বা কমান্ড প্রম্পটে নিচের কমান্ডটি রান করুন:
pip install numpy
আপনার কোডে এটি ব্যবহার করতে ইম্পোর্ট করতে হবে। ডেটা সায়েন্টিস্টদের মধ্যে np অ্যালিয়াস ব্যবহার করাটা একটি স্ট্যান্ডার্ড প্র্যাকটিস।
import numpy as np
১. অ্যারে তৈরি (Array Creation)
NumPy তে নানাভাবে অ্যারে তৈরি করা যায়। নিচে সবচেয়ে বহুল ব্যবহৃত পদ্ধতিগুলো আলোচনা করা হলো:
np.array()
লিস্ট বা টুপল থেকে সরাসরি অ্যারে তৈরি করতে np.array() ব্যবহার করা হয়।
# 1D Array
arr1 = np.array([1, 2, 3, 4, 5])
print("1D Array:", arr1)
# 2D Array
arr2 = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print("2D Array:\n", arr2)
np.zeros(), np.ones(), np.full(), np.empty()
নির্দিষ্ট সাইজের অ্যারে তৈরি করতে এগুলো ব্যবহার করা হয়।
# সব উপাদান 0 হবে
zeros_arr = np.zeros((3, 4)) # ৩টি সারি, ৪টি কলাম
# সব উপাদান 1 হবে
ones_arr = np.ones((2, 2))
# সব উপাদান নির্দিষ্ট একটি সংখ্যা হবে (যেমন ৭)
full_arr = np.full((3, 3), 7)
# র্যান্ডম ডেটা দিয়ে ইনিশিয়ালাইজ না করা অ্যারে (খুব দ্রুত তৈরি হয়)
empty_arr = np.empty((2, 2))
np.arange() এবং np.linspace()
সিকোয়েন্স বা রেঞ্জ তৈরি করার জন্য এগুলো খুব কাজে লাগে।
# ০ থেকে ৯ পর্যন্ত সংখ্যা
range_arr = np.arange(10)
# ১ থেকে ১০ পর্যন্ত ২ স্টেপ করে
step_arr = np.arange(1, 11, 2) # [1, 3, 5, 7, 9]
# ০ থেকে ১ এর মধ্যে ৫টি সমান ভাগে ভাগ করা সংখ্যা
lin_arr = np.linspace(0, 1, 5) # [0.0, 0.25, 0.5, 0.75, 1.0]
২. ইনডেক্সিং এবং স্লাইসিং (Indexing and Slicing)
ইনডেক্সিং
পাইথন লিস্টের মতোই ইনডেক্সিং করা যায়।
arr = np.array([10, 20, 30, 40, 50])
print(arr[0]) # Output: 10
print(arr[-1]) # Output: 50 (শেষ উপাদান)
# 2D Array Indexing
arr2d = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(arr2d[1, 2]) # Output: 6 (১ম ইনডেক্সের সারি, ২য় ইনডেক্সের কলাম)
স্লাইসিং
নির্দিষ্ট অংশের ডেটা এক্সট্র্যাক্ট করতে স্লাইসিং ব্যবহার করা হয়। এর সিনট্যাক্স: [start:stop:step]
arr = np.array([10, 20, 30, 40, 50, 60, 70])
print(arr[1:5]) # [20, 30, 40, 50]
print(arr[:4]) # প্রথম ৪টি [10, 20, 30, 40]
print(arr[::2]) # ২ স্টেপ করে [10, 30, 50, 70]
# 2D Array Slicing
print(arr2d[:2, 1:]) # প্রথম ২টি সারি, এবং ১ম ইনডেক্স থেকে শেষের কলামগুলো
৩. মাস্কিং বা বুলিয়ান ইনডেক্সিং (Masking)
মাস্কিং অত্যন্ত পাওয়ারফুল একটি ফিচার যার মাধ্যমে নির্দিষ্ট শর্ত পূরণ করা উপাদানগুলো ফিল্টার করা যায়।
arr = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
# একটি মাস্ক তৈরি করি (যেখানে মান ৫ এর চেয়ে বড়)
mask = arr > 5
print(mask)
# Output: [False False False False False True True True True True]
# এখন মাস্ক ব্যবহার করে অরিজিনাল অ্যারে থেকে ডেটা বের করে আনি
filtered_arr = arr[mask]
print(filtered_arr) # Output: [ 6 7 8 9 10]
# সংক্ষেপে এক লাইনে লেখা যায়
even_numbers = arr[arr % 2 == 0]
print("Even numbers:", even_numbers)
৪. ব্রডকাস্টিং (Broadcasting)
ব্রডকাস্টিং হলো এমন একটি প্রক্রিয়া যার মাধ্যমে NumPy ভিন্ন ভিন্ন শেইপ (shape) এর অ্যারেগুলোর মধ্যে ম্যাথমেটিকাল অপারেশন করতে পারে। সাধারণ নিয়মে, দুটি অ্যারের যোগ-বিয়োগ করতে হলে তাদের সাইজ হুবহু এক হতে হয়। কিন্তু ব্রডকাস্টিং ছোট অ্যারেটিকে বড় অ্যারের সাইজে ভার্চুয়ালি প্রসারিত করে।
# স্কেলার এবং অ্যারের ব্রডকাস্টিং
arr = np.array([1, 2, 3])
res = arr + 10 # 10 সংখ্যাটি সব উপাদানের সাথে যোগ হবে
print(res) # [11, 12, 13]
# ভিন্ন শেইপের অ্যারের ব্রডকাস্টিং
matrix = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
vector = np.array([1, 0, -1])
# ভেক্টরটি ম্যাট্রিক্সের প্রতিটি সারির সাথে যোগ হবে
result = matrix + vector
print(result)
# [[ 2 2 2]
# [ 5 5 5]
# [ 8 8 8]]
৫. ভেক্টরাইজড অপারেশনস (Vectorized Operations)
পাইথনে for লুপ ব্যবহার করে লিস্টের প্রতিটি উপাদানে অপারেশন চালানো বেশ ধীরগতির। NumPy-এর ভেক্টরাইজড অপারেশনস লুপ ছাড়াই পুরো অ্যারেতে একসাথে কাজ করতে পারে।
a = np.array([1, 2, 3, 4])
b = np.array([10, 20, 30, 40])
# Element-wise addition, subtraction, multiplication, division
print("Addition:", a + b)
print("Multiplication:", a * b)
print("Square:", a ** 2)
# Universal Functions (ufuncs)
print("Square Root:", np.sqrt(a))
print("Exponential:", np.exp(a))
print("Sine:", np.sin(a))
৬. লিনিয়ার অ্যালজেবরা (Linear Algebra Basics in NumPy)
মেশিন লার্নিং ও ডেটা সায়েন্সে লিনিয়ার অ্যালজেবরার ব্যবহার অপরিহার্য। numpy.linalg মডিউলে লিনিয়ার অ্যালজেবরার অনেক গুরুত্বপূর্ণ ফাংশন রয়েছে।
A = np.array([[1, 2], [3, 4]])
B = np.array([[5, 6], [7, 8]])
# ১. ম্যাট্রিক্স মাল্টিপ্লিকেশন (Matrix Multiplication)
# ডট প্রোডাক্ট বা ম্যাট্রিক্স গুণন
dot_product = np.dot(A, B)
# অথবা
matmul_result = A @ B
print("Matrix Multiplication:\n", matmul_result)
# ২. ট্র্যান্সপোজ (Transpose)
print("Transpose of A:\n", A.T)
# ৩. ইনভার্স ম্যাট্রিক্স (Inverse of Matrix)
A_inv = np.linalg.inv(A)
print("Inverse of A:\n", A_inv)
# ৪. ডিটারমিন্যান্ট (Determinant)
det_A = np.linalg.det(A)
print("Determinant of A:", det_A)
# ৫. আইগেনভ্যালুস এবং আইগেনভেক্টরস (Eigenvalues and Eigenvectors)
eigenvalues, eigenvectors = np.linalg.eig(A)
print("Eigenvalues:", eigenvalues)
উপসংহার
NumPy শুধুমাত্র একটি লাইব্রেরি নয়, এটি পাইথনের পুরো ডেটা সায়েন্স ইকোসিস্টেমের (যেমন Pandas, SciPy, Scikit-learn) মূল ভিত্তি। Array creation থেকে শুরু করে Broadcasting, Masking এবং Linear Algebra—NumPy-এর ফিচারগুলো প্রচুর ডেটা নিয়ে কাজ করাকে করেছে অত্যন্ত সহজ এবং দ্রুত। এই গাইডটি প্র্যাকটিস করার মাধ্যমে আপনি আপনার ডেটা সায়েন্স যাত্রায় এক ধাপ এগিয়ে গেলেন।