Numpy পরিচিতি
দ্রষ্টব্য: এখন থেকে কোডগুলো করা হবে Python 3 এ, আপনি যদি Python 2 সেটাপ দিয়ে থাকেন তাহলে একটি ভার্চুয়াল এনভায়রনমেন্ট তৈরি করে Python 3 সেটাপ দিয়ে দিন, আগের কোডগুলো Python 3 এ রূপান্তরিত করার প্রক্রিয়া চলছে।
Numpy ইন্সটলেশন
আপনার Numpy না থাকলে কমান্ড উইন্ডো / টার্মিনালে নিচের কোড লিখুন,
pip install numpy scipy matplotlib ipython jupyter pandas sympy noseআর আপনি অ্যানাকোন্ডা সেটাপ দিয়ে থাকলে আপনার পিসিতে অলরেডি Numpy ইন্সটলড আছে। কোন সমস্যা দেখা দিলে এই ডকুমেন্টেশন দেখুন।
গ্রেডিয়েন্ট ডিসেন্ট আমরা চাইলে একাধিক লুপ অ্যাপ্লাই করে সিঙ্গেল এলিমেন্ট দিয়ে করতে পারি কিন্তু সেটা মোটেও এফিশিয়েন্ট হবে না। মেশিন লার্নিংয়ের জন্য কম্পিউটেশন টাইম কমানোটা খুবই গুরুত্বপূর্ণ। আর সেটা করতে হলে আমাদের অবশ্যই Numpy লাইব্রেরির উপর ভাল দখল থাকতে হবে। ধীরে ধীরে সমস্যা সমাধানের মাধ্যমে Numpy লাইব্রেরির উপরে এমনিতেই দক্ষতা চলে আসবে।
Numpy এ হাতেখড়ি
সায়েন্টিফিক কম্পিউটেশনের জন্য মূলত Numpy ব্যবহার করা হয়। মেশিন লার্নিং সমস্যা গুলোতে হাই ডাইমেনশনাল অ্যারে নিয়ে কাজ করতে হয় সেকারণে আমাদের এমন ধরণের টুল দরকার যেটা এই ধরণের হাই ডাইমেনশনাল অ্যারে নিয়ে খুবই ফাস্ট কাজ করতে পারে। Numpy হল এমন ধরণের একটি লাইব্রেরি। MATLAB এ আমরা যেভাবে অ্যারে নিয়ে কাজ করে থাকি, Numpy কে আমরা সেক্ষেত্রে Python এর MATLAB ইন্টারফেস বলতে পারি। তবে বেশ কিছু ভিন্নতাও আছে।
পুরোপুরি জানার জন্য নামপাইয়ের ডকুমেন্টেশন যথেষ্ট। তবে এখানে আমি গুরুত্বপূর্ণ নিয়ে আলোচনা করব। তাহলে শুরু করা যাক।
অ্যারে (Array)
Numpy Array হল কতগুলো ভ্যালুর গ্রিড। এবং সবগুলা ভ্যালুর টাইপ একই, মানে float , int64 , int8 ইত্যাদি।
একটা অ্যারের ডাইমেনশন যত তাকে আমরা Rank বলে থাকি । যেমন 2 Dimensional Numpy Array কে আমরা বলব Rank 2 Array। Numpy এ অ্যারের Shape Integer এর একটা Tuple যেখানে প্রতিটি ডাইমেনশনে কতগুলি এলিমেন্ট আছে সেটা প্রকাশ করে।
নিচের উদাহরণ দেখা যাক,
import numpy as np
a = np.array([1, 2, 3]) # Creates a rank 1 array
print (type(a)) # Prints "<class 'numpy.ndarray'>"
print (a.shape) # Prints "(3,)"
print (a[0], a[1], a[2]) # Prints "1 2 3"
a[0] = 5 # Change an element of the array
print(a) # Prints "[5 2 3]"
b = np.array([[1, 2, 3], [4, 5, 6]]) # Create a rank 2 array
print (b.shape) # Prints "(2, 3)"
print (b[0, 0], b[0, 1], b[1, 0]) # Prints "1 2 4"Numpy এ কিছু ফাংশনও আছে যেগুলো ব্যবহার করে আমরা নির্দিষ্ট আকারের অ্যারে তৈরি করতে পারি,
অ্যারে সম্পর্কে আরও জানতে এই ডকুমেন্টেশনটি দেখুন।
অ্যারে ইনডেক্সিং (Array Indexing)
বেশ কিছু উপায়ে Numpy অ্যারে ইন্ডেক্স করা যায়।
স্লাইসিং (Slicing)
পাইথন লিস্ট আমরা যেভাবে স্লাইস করি, সেভাবেই Numpy অ্যারেও স্লাইস করা যায়, Array যেহেতু মাল্টিডাইমেনশনাল হতে পারে সেক্ষেত্রে প্রতিটা ডাইমেনশনের জন্য উল্লেখ করতে হবে কোন ইনডেক্স থেকে কত পর্যন্ত আপনি স্লাইস করতে
চাইলে ইন্টিজার ইন্ডেক্সিং ও স্লাইস ইন্ডেক্সিং মিশিয়েও লেখা যায়। কিন্তু সেটা করলে নতুন অ্যারের Rank ১ করে কমবে, যেমন
ইন্টিজার অ্যারে ইন্ডেক্সিং (Integer Array Indexing)
Numpy অ্যারে ইন্টিজার দিয়ে স্লাইসিং করলে নতুন অ্যারেগুলো সবসময়ই আসল অ্যারের সাব অ্যারে হবে। মানে, ইন্টিজার অ্যারে ইন্ডেক্সিং দিয়ে নতুন আরবিটরারি অ্যারে তৈরি করা যায় যে অ্যারের এলিমেন্ট আসবে আসল অ্যারে থেকে।
আমাদের যদি এমন একটা অ্যারে দরকার হয় যার এলিমেন্টগুলো অ্যাসেন্ডিং অর্ডারে থাকবে যেমন 0, 1, 2, 3 তাহলে np.arange(num) ফাংশন দিয়ে ঔরকম অ্যারে তৈরি করা যায়।
উদাহরণ দেখলে বিষয়টা বুঝা যাবে,
আরেকটা উপায়ে ইন্ডেক্সিং করা যায়, যেমন
বুলিয়ান এক্সপ্রেশন দিয়ে অ্যারে ইন্ডেক্সিং (Boolean Array Indexing)
বুলিয়ান অ্যারে ইন্ডেক্সিং এর মাধ্যমে আমরা বিভিন্ন শর্ত দিয়ে এলিমেন্ট বাছাই করতে পারি। Pandas লাইব্রেরিতেও এই কাজটা করা যায়। উদাহরণের মাধ্যমে দেখা যাক,
অনেক সংক্ষেপে এখানে ইন্ডেক্সিং উপস্থাপন করা হয়েছে, আরও ডিটেলস এর জন্য ডকুমেন্টেশন দেখতে হবে।
ডেটাটাইপ (Datatypes)
অ্যারে তৈরির সময় Numpy অনুমান করার চেষ্টা করে আপনি কোন ডেটাটাইপের অ্যারে তৈরি করছেন। কিন্তু আপনি যদি চান Integer দিয়ে অ্যারে তৈরি করবেন কিন্তু পরে float টাইপের এলিমেন্টও রাখতে হতে পারে তাহলে আপনাকে তার অনুমানকে Override করতে হবে, সেজন্য Numpy তে একটা অপশনাল আর্গুমেন্ট আছে। উদাহরণে দেখা যাক,
**অ্যারে ম্যাথ (Array Math)
বেসিক ম্যাথ
এই টপিকটা খুবই গুরুত্বপূর্ণ। কারণ এটা ব্যবহার করেই আমরা লুপ ব্যবহারের হাত থেকে বাঁচব।
মনে রাখতে হবে, ম্যাথমেটিক্যাল অপারেটর সাধারণত এলিমেন্টওয়াইজ কাজ করে। এবং প্রতিটা অপারেটরের কাজ আবার Numpy এর বিল্টইন ফাংশন করেও করা যায়।
ম্যাট্রিক্স অপারেশন
আমরা আগেই দেখেছিলাম, মেশিন লার্নিং মানেই ম্যাট্রিক্স নিয়ে কাজ কারবার, তাই আমাদের Numpy এর মাধ্যমে Matrix ম্যানিপুলেশন ভালভাবে জানতে হবে। এলিমেন্টওয়াইজ গুণ করে কীভাবে, ম্যাট্রিক্স মাল্টিপ্লিকেশন করে কীভাবে। কোডে হাত দেওয়ার আগে ডট গুণন টা একটু রিভাইজ দেওয়া যাক,
ভেক্টরের ডট গুণন (Dot Product of vectors)
এবং এর ডট প্রডাক্ট হবে,
ম্যাট্রিক্স আকারে
ম্যাট্রিক্সে ডট গুণন (Dot product of Matrices / Multiplication of Matrices)
কিন্তু যদি ম্যাট্রিক্সের ডট গুণনের কথা চিন্তা করি তাহলে এইরকম হবে,
এখন এই দুইটা ম্যাট্রিক্সের ডট গুনন কী হবে? দেখা যাক,
ধরি, একটি ম্যাট্রিক্স,
যদি কে এর সাথে ডট গুণন বা ম্যাট্রিক্স মাল্টিপ্লিকেশন করি তাহলে,
কিন্তু,
করা যাবে না,
দুইটা ম্যাট্রিক্সের ডট প্রডাক্টের শর্ত হল, যদি প্রথম ম্যাট্রিক্সের ডাইমেনশন হয় এবং দ্বিতীয় ম্যাট্রিক্সের ডাইমেনশন হয় তাহলে হতে হবে
এর ডাইমেনশন এবং এর ডাইমেনশন তাই এদের মাল্টিপ্লাই করা যাবে না।
এবার কোড দেখা যাক,
এখন আমাদের যদি সব গুলো এলিমেন্টের যোগফল কিংবা কলামওয়াইজ যোগফল লাগে সেক্ষেত্রে Numpy এর sum ফাংশনটি খুব কাজে দেয়।
ব্রডকাস্টিং (Broadcasting)
যদি বিভিন্ন শেপের অ্যারে নিয়ে কাজ করতে হয় সেক্ষেত্রে Numpy এর Broadcasting মেকানিজম খুবই কাজে লাগে। যেমন, আমরা যদি Numpy এর ব্রডকাস্টিং ছাড়া নিচের কাজটা করতে চাই,
কিন্তু, ম্যাট্রিক্স যখন অনেক বড় হবে, লুপ দিয়ে এভাবে কম্পিউট করা স্লো হয়ে যাবে। আমরা যদি এর আরও তিনটা কপি করে রো ওয়াইজ সাজাতে পারি,
তাহলে কিন্তু আমরা সহজেই এর সাথে যোগ করতে পারব। এই কপি করাটা Numpy এ এভাবে করা যায়,
আসলে এত সব কাজ করারও কোন দরকার ছিল না, Numpy এটা নিজেই হ্যান্ডেল করে থাকে, আর এটাই হল Numpy এর Broadcasting
ব্রডকাস্টিং সম্পর্কে আরও বিস্তারিত জানতে Numpy User Guide, Release 1.11.0 - Section 3.5.1 (General Broadcasting Rules) দেখুন
ব্রডকাস্টিংয়ের অ্যাপ্লিকেশন
Numpy এর বেসিক কিছু অপারেশন দেখানো হল। পরবর্তী পর্বেই আমরা Numpy লাইব্ররি ব্যবহার করে ফরমুলা অ্যাপ্লাই করা শুরু করব।
Last updated