آموزش کتابخانه numpy در پایتون
این پست به آموزش کتابخانه numpy در پایتون اختصاص دارد. کتابخانه numpy، یک کتابخانه بسیار پرکاربرد در حوزه کامپیوتر ساینس است. این کتابخانه امکانات زیادی برای کار با آرایهها دارد. از این رو یادگیری آن برای همه محققانی که میخواهند در حوزه کامپیوترساینس فعالیت داشته باشند ضروری است. اگر میخواهید با نامپای و دستورهای مهم آن آشنا شوید، آموزش نامپای هوسم را از دست ندهید…
مقدمه
دادهها از اهمیت ویژهای در حوزه علوم کامپیوتر (Computer Science) برخوردار هستند. شاید وقتی کلمه داده را بشنوید، سریع یک مجموعه عدد به صورت ماتریس در ذهن شما شکل بگیرد. اما، باید به شما بگویم که داده در شکلهای مختلفی میتواند ظاهر شود و ممکن است ظاهرش عدد نباشد! مثلا متن را میتوانیم یک داده در نظر بگیریم. تصویر هم میتواند یک داده باشد. طبیعتا، صوت هم میتواند یک داده باشد. بنابراین، اگرچه اینها از لحاظ ظاهری شکل متفاوتی از دادههای عددی دارند، اما بازهم داده محسوب میشوند.
گفتیم متن، تصویر و صوت از لحاظ ظاهری شکل متفاوتی با دادههای عددی دارند. آیا در باطن فرق دارند؟! بله، متن، تصویر و صوت در باطن همان دادههای عددی هستند! در واقع صرفا نمایش آنها به صورت شکل 1 است، اما پشت این رنگ و لعاب یکسری عدد است.
به عنوان مثال، تصاویر را میتوان به صورت آرایه دوبعدی از اعداد درنظر گرفت که این اعداد شدت روشنایی هر پیکسل را نشان میدهند. دادههای متنی را نیز میتوان از روشهای متعددی به داده عددی تبدیل کرد. وقتی میگوییم پردازش تصویر، پردازش متن یا پردازش صوت، منظورمان پردازش مستقیم روی شکلهای ظاهری (شکل 1) نیست، بلکه پردازش روی شکل باطن آنها (همان اعداد) است. پس، صرف نظر از اینکه دادهها از چه نوعی هستند، اولین قدم تبدیل آنها به آرایهای از اعداد است تا قابل پردازش شوند.
به همین دلیل، کار با دادههای عددی یک مساله مهم در دیتاساینس است. البته، ما تنها دغدغه کار با داده ها را نداریم، بلکه باید بتوانیم کار با دادههای عددی را به صورت بهینه انجام دهیم. یعنی، هم راحتی کار برای ما دغدغه هست و هم سرعت انجام عملیات روی دادهها.
معرفی کتابخانه نامپای
نامپای یک کتابخانه پایتونی است که برای کار با دادههای آرایهای ارائه شده است. numpy مخفف numerical python است. از برخی جهات آرایههای نامپای شبیه به لیستها در پایتون هستند. اما تفاوت این دو با بزرگ شدن حجم دادهها مشخص میشود. آرایهها و توابع نامپای مخصوص کار با دادههای بزرگ طراحی شدهاند و نسبت به لیستها بسیار بهینهتر هستند. به همین دلیل است که در پاراگراف قبل گفتیم میخواهیم به صورت بهینه با دادهها کار کنیم. بسیارخب، مقدمه طولانی شد! برویم و سریعتر آموزش نامپای را شروع کنیم.
تاریخچه کتابخانه نامپای
کتابخانه نامپای (NumPy) یکی از مهمترین کتابخانههای پایتون برای کار در حوزه کامپیوترساینس است. این کتابخانه امکان کار با آرایهها و ماتریسهای بزرگ و چندبعدی را فراهم میکند. بعلاوه، این کتابخانه دریایی از توابع ریاضی را در خود دارد که میتوان روی آرایهها اعمالشان کرد.
همیشه آقای Travis Oliphant به عنوان خالق نامپای معرفی میشود. اما اینطور نیست که ایشان یک روزی تصمیم به خلق کتابخانهای در پایتون گرفته باشند! ساخته شدن کتابخانه نامپای هم ماجرا دارد که من خلاصه برایتان تعریف میکنم. پایتون به صورت خاص برای کار با اعداد طراحی نشده بود. اما به مرور زمان توجه جامعه علمی و مهندسان را به خودش جلب کرد. همین باعث ساخته شدن کتابخانه Numeric و پس از آن کتابخانه Numarray شد.
تمایل بسیار زیادی وجود داشت که کتابخانه Numeric تبدیل به کتابخانه استاندارد پایتون شود، اما Guido van Rossum ایراداتی به کدهای Numeric داشت و از این کار جلوگیری کرد. سرانجام در سال 2005 آقای Travis Oliphant با هدف متحد کردن جامعه علمی، دو کتابخانه Numarray و Numeric را در هم ادغام کرده و NumPy را ارائه کرد! جالب است بدانید که NumPy ابتدا بخشی از کتابخانه SciPy بود. اما چون SciPy کتابخانه بزرگی است، تصمیم گرفته شد که نامپای را به صورت جداگانه ارائه دهند.
تفاوت تعریف آرایه در نامپای و لیست در پایتون
در بخش معرفی گفتیم که نامپای برای کار با آرایهها در پایتون ساخته شده است. اگر با پایتون آشنایی داشته باشید، احتمالا میدانید که با استفاده از لیست هم میتوان در پایتون یک آرایه تعریف کرد. خب اگر اینطور هست، چه نیازی به کتابخانه نامپای داریم؟ در جواب این سوال میتوان ویژگیهای زیر را معرفی کرد:
- سرعت بالاتر
مهمترین تفاوت آرایه تعریف شده در نامپای با آرایهای که به صورت لیست ساخته شده است، سرعت آنهاست! شاید در ابعاد پایین این مساله زیاد هم قابل لمس نباشد، اما در کار با آرایههای بزرگ و چندبعدی اهمیت سرعت بیشتر مشخص میشود.
دلیل سریعتر بودن نامپای، نحوه ذخیره شدن دادهها در حافظه است. در یک لیست برای هر عنصر، یک پوینتر وجود دارد. هرکدام از پوینترها به نقطهای از حافظه اشاره میکنند که اطلاعات مربوط به عنصر متناظرشان در آنجا ذخیره شده است. این پوینترها پشت سر هم نیستند و ممکن است دو عنصر کنار هم در دو نقطه متفاوت از حافظه ذخیره شوند.
اما در نامپای تمامی آرایهها کنار هم ذخیره میشوند. همین امر باعث میشود دسترسی به المانهای یک آرایه در نامپای با سرعت بیشتری انجام شود!
- حلقههای کمتر
نامپای این امکان را میدهد که حلقههای کمتری استفاده کنید! چطور؟ در نامپای توابع ریاضی وجود دارند که کمک میکنند یکسری عملیات ریاضی به صورت ماتریسی انجام شوند. اگر با کدنویسی متلب آشنایی داشته باشید احتمالا آنجا نیز چنین رفتاری را دیدهاید! طبیعتا انجام برخی محاسبات مثلا ضرب دو آرایه اگر به صورت ماتریسی انجام شوند، زمان کمتری طول میکشند.
- کدهای تمیزتر
وقتی حلقههای کمتری استفاده میشوند، قطعا تعداد خطوط کد شما کمتر شده و تمیزتر و خواناتر خواهد شد (این یکی شاید من درآوردی به نظر بیاد ولی واقعا درسته).
نصب و فراخوانی نامپای
نصب نامپای بسیار ساده است. برای نصب نامپای کافی است که CMD را در ویندوز باز کرده و بنویسید:
pip install numpy
با اجرای دستور بالا نامپای نصب خواهد شد و شما میتوانید آن را فراخوانی کنید. برای فراخوانی نامپای کافی است بنویسید:
import numpy
اما میتوانید یک نام خلاصه هم برای نامپای درنظر بگیرید. معمولا نام کوتاه شده np برای این کتابخانه درنظر گرفته میشود:
import numpy as np
حالا کتابخانه نامپای فراخوانی شده و آماده استفاده است. برویم سراغ بخش بعدی از پست «آموزش کتابخانه numpy در پایتون»…
تعریف آرایه در پایتون
در این بخش از آموزش کتابخانه numpy در پایتون، نحوه تعریف آرایه در پایتون و نامپای به صورت کامل آموزش داده میشود. برای کار با آرایهها در پایتون، قدم اول طبیعتا تعریف یک آرایه است. تعریف آرایه در پایتون با استفاده از کتابخانه نامپای انجام میشود.
تعریف یک آرایه در نامپای بسیار ساده است. کافی است که از متد ()np.array استفاده کنید. برای این کار کافیست که داخل پرانتز، آرایه خود را به شکل یک لیست تو در تو وارد کنید! اگر با لیستها آشنایی ندارید، اینجا کلیک کنید.
دست به کیبورد شوید تا با چند مثال، نحوه تعریف آرایه در پایتون را به خوبی یاد بگیرید. بیایید با تعریف یک بردار سطری ساده شروع کنیم. در اولین مثال، میخواهیم برداری با سه عنصر 1، 2 و 3 تعریف کنیم.
به این منظور کافی است بنویسید:
arr_1 = np.array([1, 2, 3])
به همین سادگی که میبینید، برداری سطری با عناصر 1، 2 و 3 تعریف کردیم. حالا همین بردار را به صورت ستونی میخواهیم تعریف کنیم.
برای این کار کد بالا را به شکل زیر تغییر میدهیم:
arr_2 = np.array([[1], [2], [3]])
مشاهده میکنید که دقیقا به شکل یک لیست تو در تو نوشته شده است. خب از کجا معلوم که واقعا یک بردار ستونی باشد؟ پرینتش کنید و ببینید:
print(arr_2)
array([[1], [2], [3]])
حالا مثلا برای نوشتن یک ماتریس 3 در 2 به شکل زیر، چه باید بنویسیم؟
برای تعریف چنین آرایهای کافی است آن را به صورت یک لیست تو در تو بنویسیم، یعنی به شکل زیر:
سمت چپ ماتریس موردنظر و سمت راست نحوه تعریف این آرایه در نامپای آورده شده است. برای تعریف این آرایه کافی است بنویسید:
arr_3 = np.array([[1, 1], [2, 2], [3, 3]])
مشاهده میکنید که یک ماتریس 3 در 2 با درایههای خواسته شده ساختیم. به همین ترتیب میتوانیم هر آرایهای را با نامپای بسازیم.
محاسبه ابعاد یک آرایه نامپای
برای محاسبه ابعاد یک آرایه در نامپای میتوان از shape استفاده کرد. shape یکی از attribute-های آرایه در نامپای است. از قضا این اتریبیوت بسیار بسیار بسیااار پر استفاده است! برای محاسبه ابعاد یک آرایه در پایتون مثلا arr_3، کافی است بنویسید:
arr_3.shape
(3, 2)
مشاهده میکنید که نتیجه (2 ,3) است. عدد اول تعداد سطرها و عدد دوم تعداد ستونها را نشان میدهد.
نکته بعد از shape نباید از پرانتز استفاده کنید! اگر پرانتز بگذارید با خطا مواجه میشوید.
اندیس دهی به آرایه در نامپای
همانطور که میدانید، اندیس دهی برای دسترسی به محتوای یک آرایه استفاده میشود. به این منظور، کافی است آدرس درایه موردنظر را داشته باشیم. آدرس یک درایه، شماره سطر و ستون آن درایه است. دقت کنید که در پایتون، اندیسها از صفر شروع میشوند. یعنی اگر درایهای در ستون اول باشد، شماره آن در پایتون صفر است! برای سطرها هم همینطور، اگر در سطر دوم باشد، شماره آن در پایتون، یک خواهد بود! به شکل زیر میتوانید درایهای که در سطر دوم و ستون اول از arr_3 وجود دارد را استخراج کنید:
arr_3[1, 0]
2
دقت کنید که اول شماره سطر را وارد کردیم و بعد شماره ستون را. به همین ترتیب میتوانید هر درایهای که دلتان بخواهد را استخراج کنید.
تکهبرداری (Slicing) آرایه در نامپای
تکهبرداری یا اسلایسینگ به این معناست که یک بخش از آرایه را برداریم. مثلا ستون اول و سطر اول و دوم. برای انجام چنین عملیاتی در پایتون از علامت کولن (:) کمک میگیریم. علامت : در پایتون معادل با «تا» است. یعنی یک بازه را انتخاب میکند. اما دقت کنید که این بازه، بازه باز است! مثلا سطر اول و دوم را میتوان نوشت، 0:2، این یعنی بازه باز 0 تا 2، یعنی همان اندیس 0 و 1. برای انتخاب ستون اول و سطر اول و دوم از arr_3 کافی است بنویسید:
arr_3[0:2, 0]
array([1, 2])
درست است دیگر نه؟ ستون اول و سطر اول و دوم را برداشتیم. حالا اگر بخواهیم ستون اول و دوم و سطر دوم و سوم را برداریم چه باید بنویسیم؟ باید بنویسیم:
arr_3[1:3, 0:2]
array([[2, 2], [3, 3]])
اما علامت : را دست کم نگیرید. اگر این علامت را به تنهایی برای اسلایسینگ استفاده کنید، به معنی تمامی عناصر آن بعد است. یعنی از اول تا آخر! مثلا اگر بخواهیم، تمامی عناصر موجود در ستون دوم را برداریم، کافی است بنویسیم:
arr_3[:, 1]
array([1, 2, 3])
در واقع ما اندیس شروع و پایان را مشخص نکردیم و مشاهده میکنید که تمامی عناصر موجود در ستون دوم، استخراج شده است.
یک نکته جالب دیگر اینکه، اگر سمت چپ علامت : را خالی بگذاریم، یعنی از اندیس صفر شروع کن و اگر سمت راست آن را خالی بگذاریم یعنی تا اندیس آخر ادامه بده! یعنی برای انتخاب عناصر موجود در ستون اول و سطر اول و دوم، کافی است بنویسید:
arr_3[:2, 0]
array([1, 2])
یا برای انتخاب عناصر موجود در ستون اول و سطر دوم و سوم باید بنویسید:
arr_3[1:, 0]
array([2, 3])
به همین راحتی!
متدهای تعریف ماتریس های خاص در نامپای
در زبانهای برنامهنویسی مثل متلب، دستورهایی وجود دارند که یکسری ماتریس های خاص و رایج را به کمک آنها میتوان تعریف کرد. مثلا ماتریس صفر، یا یک! در نامپای هم متدهایی وجود دارند که ماتریس های خاص را میتوان با آنها تعریف کرد. در ادامه پست «آموزش کتابخانه numpy در پایتون» نحوه تعریف چند ماتریس خاص را معرفی خواهیم کرد.
تعریف ماتریس صفر در نامپای
ماتریس صفر، یعنی ماتریسی که تمام عناصر آن صفر باشد. برای تعریف یک ماتریس صفر در نامپای کافی است از متد zeros استفاده کنید. شما باید تعداد سطر و ستون ماتریس را مشخص کنید. مثلا برای یک ماتریس صفر به ابعاد 2 در 4، کافی است بنویسید:
np.zeros((2, 4))
array([[0., 0., 0., 0.], [0., 0., 0., 0.]])
مشاهده میکنید که یک ماتریس 2 در 4 تعریف کردیم که تمام درایههای آن صفر است! به پرانتزها دقت کنید! همیشه باید ابعاد را در پرانتز بنویسید!
اگر بخواهیم یک بردار صفر به طول 5 تعریف کنیم چه؟ کافی است بنویسیم:
np.zeros(5)
یا
np.zeros((1, 5))
خروجی هردو کد برابر است با:
array([[0., 0., 0., 0., 0.]])
با کد زیر هم میتوانید یک بردار ستونی به طول 5 تعریف کنید:
np.zeros((5, 1))
array([[0.], [0.], [0.], [0.], [0.]])
مشاهده میکنید که این بار یک ماتریس ستونی تعریف کردیم که تمامی عناصر آن صفر است.
تعریف ماتریس یک در نامپای
ماتریس یک، ماتریسی است که تمامی درایههای آن یک هستند. برای تعریف چنین ماتریسی در نامپای از دستور ones استفاده میکنیم. نحوه استفاده از این دستور نیز مشابه با دستور zeros است. برای تعریف یک ماتریس 2 در 4 با درایههای یک، کافی است بنویسید:
np.ones((2, 4))
array([[1., 1., 1., 1.], [1., 1., 1., 1.]])
در اینجا هم باید ابعاد را در پرانتز بنویسیم! تعریف بردار یک به طول 5 نیز به شکل زیر انجام میشود:
np.ones(5)
array([1., 1., 1., 1., 1.])
np.ones((5, 1))
تعریف ماتریس همانی در نامپای
ماتریس همانی، ماتریسی است که در آن عناصر روی قطر اصلی یک و بقیه درایهها صفر هستند. تصویر زیر را ببینید:
این تصویر یک ماتریس همانی با ابعاد 4 در 4 را نشان میدهد. چنین ماتریسی در نامپای با کمک متد eye ساخته میشود. مثلا برای ماتریس همانی که در شکل بالا مشخص شده، کافی است بنویسید:
np.eye(4)
array([[1., 0., 0., 0.], [0., 1., 0., 0.], [0., 0., 1., 0.], [0., 0., 0., 1.]])
یک ماتریس همانی در ریاضیات همیشه مربعی است. بنابراین وقتی یک عدد به eye بدهیم با آن یک ماتریس مربعی میسازد! اگرچه در ریاضیات یک ماتریس همانی، همیشه مربعی است، اما در نامپای ماتریس همانی میتواند ماتریس مربعی نباشد! مثلا میتوانیم در نامپای یک ماتریس همانی به ابعاد 4 در 6 بسازیم:
np.eye(4, 6)
array([[1., 0., 0., 0., 0., 0.], [0., 1., 0., 0., 0., 0.], [0., 0., 1., 0., 0., 0.], [0., 0., 0., 1., 0., 0.]])
مشاهده میکنید که عناصر روی قطر اصلی (تا جایی که وجود دارد)، یک و بقیه صفر هستند. دقت کنید که در استفاده از متد eye نیاز نیست که ابعاد را داخل پرانتز بنویسید، بلکه میتوانید آن را مستقیما به این دستور بدهید.
ساخت آرایه با مقدار دلخواه در نامپای
در نامپای این امکان وجود دارد که یک آرایه با ابعاد دلخواه بسازید که تمامی عناصر آن یک عدد ثابتِ دلخواه باشند. از متد full برای این کار میتوانید استفاده کنید. مثلا فرض کنید بخواهید یک آرایه 5 در 3 با مقدار 2 تعریف کنید. برای این کار باید بنویسید:
np.full((5, 3), 2)
array([[2, 2, 2], [2, 2, 2], [2, 2, 2], [2, 2, 2], [2, 2, 2]])
مشاهده میکنید که بدون هیچ دردسری یک ماتریس ساختیم و آن را با عدد 2 پر کردیم. دقت کنید که اینجا هم ابعاد را در یک پرانتز جداگانه وارد کردیم. برای معرفی یک بردار ستونی به طول 7 و با مقادیر 4 چه باید بنویسیم؟ کافی است بنویسیم:
np.full((7, 1), 4)
array([[4], [4], [4], [4], [4], [4], [4]])
full(15, 7)
آموزش کتابخانه numpy در پایتون ادامه دارد…
مطالب زیر را حتما مطالعه کنید
علامت تقسیم ، باقیمانده و خارج قسمت در پایتون
روش اعتبارسنجی متقابل یا cross validation چیست
نصب کتابخانه matplotlib در پایتون
مقایسه تنسورفلو و پایتورچ
کوندا چیست
شبکه عصبی GRU
3 دیدگاه
به گفتگوی ما بپیوندید و دیدگاه خود را با ما در میان بگذارید.
سلام ؛
خسته نباشید
بسیار روان ، خلاصه و مفید بود
ادامش چی؟
سلام
مطالب واقعا مفید و کاربردی بود.