آشنایی با کتابخانه numpy
نامپای یک بسته نرمافزاری قابل افزودن به پایتون است که کاربرد اصلیاش در مقاصد علمی و برای کار با اعداد است. تقریبا در همه زمینههای علمی و مهندسی استفاده می شود. numpy یک شیء آرایهای چند بعدی ارائه میدهد که کار با آرایهها را سریع میکند. مثل عملیات ریاضیاتی، منطقی، تغییر شکل آرایه، مرتب کردن مقادیر آرایه، انتخاب کردن، i/o، تبدیل فوریه، جبرخطی، محاسبات آماری، تولید دادههای تصادفی. در این پست میخواهیم با کتابخانه نامپای و دو ویژگی اصلی آن یعنی broadcasting و vectorization آشنا شویم.
Numpy مخفف عبارت numerical python است و همانطور که از اسم آن مشخص است هدف این بسته، تسهیل عملیات روی اعداد است. در هسته numpy شیء ndarray وجود دارد که بسیاری از توابع را پشتیبانی می کند و کار با آرایههای چند بعدی را آسان میکند.
فرق آرایه های numpy با مجموعه های استاندارد (list) پایتون
برخلاف لیستهای پایتون، آرایهها در numpy در همان ابتدای ساخت اندازه ی ثابتی دارند (fixed size). تغییر اندازه یک ndarray باعث ایجاد یک آرایه جدید و حذف آرایه قبلی خواهد شد.
تمامی عناصر در یک آرایه numpy باید از یک نوع باشند، و از اینرو تمام درایه ها با یک اندازه در حافظه ذخیره خواهند شد.
مزایای استفاده از numpy
آرایههای numpy عملیات ریاضیاتی پیشرفته و سایر عملیات پیشرفته را روی تعداد زیادی از دادهها تسهیل میکنند. معمولا این عملیات خیلی بهتر انجام می شود و تعداد خطوط برنامهنویسی کمتری نیاز است.
کتابخانههایی که از numpy استفاده میکنند رو به افزایش است. این کتابخانهها قبل پردازش، ورودیها را به آرایههای numpy تبدیل میکنند. به عبارتی برای اینکه بتوانیم از کتابخانههای مختلف استفاده کنیم، باید با numpy آشنا باشیم.
سرعت و اندازه در محاسبات علمی و عددی بسیار مهم است.
فرض کنید که میخواهید درایه های یک مجموعه ی یک بعدی را به درایه های یک مجموعه یک بعدی دیگری ضرب کنید. اگر داده در دو تا لیست پایتون a, b ذخیره شده باشد، در اینصورت میتوانیم با کمک حلقه، درایه های دو مجموعه را بهم ضرب کنیم.
اگر a و b داخلشون یک میلیون عدد باشه چی؟! چقدر زمانبر خواهد بود!
این عملیات در زبان c با کمک کد زیر خیلی سریعتر انجام می شود.
این کد باعث صرف جویی در تمام هزینه های مربوط به تفسیر کدپایتون و دستکاری objectها می شود. اما به قیمت از دست دادند برنامهنویسی در محیط خوب پایتون!
Numpy بهترین هر دو را به ما میدهد!
عملیات نظیر به نظیر (درایه به درایه)، مود پیش فرض در ndarray است و این عملیات به خاطر اینکه از کدهای c از قبل کامپایل شده استفاده میکند، خیلی سریع انجام می شوند.
از لحاظ سادگی شبیه برنامه نویسی پایتون، و از لحاظ سرعت اجرا، شبیه زبان برنامه نویسی c است.
چرا numpy خوبه؟
کتابخانه numpy دو ویژگی خیلی خوبی دارد و همین باعث قدرتمند شدن آن شده است. چرا که برنامه نویسی در محیط پایتون و کار با اعداد بسیار ساده و البته سریع کرده است.
Broadcasting و vectorization راهی برای سرعت بخشیدن به زمان محاسبات و بهینه کردن استفاده از فضای حافظه در زمان عملیات ریاضیاتی در NumPy هستند.
مفهوم vectorization در نامپای
Vectorization فرایندی است که در آن یک الگوریتم به جای اینکه روی تک تک مقادیر جداگانه کار کند، روی چندین مقدار (vector) همزمان عملیات انجام میدهد. و همین باعث میشود که ما در کار با آرایههای عددی در نامپای از حلقه استفاده نکنیم. برای مثال در شکل زیر دو بردار سه مقداره باهم جمع میشوند. اگر بردارسازی نباشد، در این صورت لازم است که یک حلقه بنویسیم تا در هر تکرار روی یکی از مقادیر عملیات ریاضی را انجام دهد. در حالی که در کد برداری شده، این عملیات همزمان انجام می شود. البته همانطور که اشاره کردیم، حلقه در پشت صحنه به زبان c کامپایل شده، انجام میشود که سرعت بالایی دارد.
مزیتهای کد برداری شده (vectorized code)
- کد برداری شده خلاصه است و درک آن راحتتره
- خطوط برنامه نویسی کم یعنی باگ کمتر
- کدها خیلی شبیه به علامتهای ریاضیاتی است. در نتیجه پیادهسازی روابط ریاضیاتی ساده تر خواهد بود.
- بردارسازی باعث میشود که کد ما خیلی پایتونی (جمع و جور) باشه. بدون برداری باید با کلی حلقه سرو کار داشته باشیم.
مفهوم broadcasting در نامپای
Broadcasting وسیله ای برای بردار کردن عملیات آرایه فراهم می کند به طوری که حلقه به جای پایتون در C انجام می شود.. این کار را بدون کپی از داده ها انجام می دهد و معمولاً به پیاده سازی الگوریتم های کارآمد منجر می شود.
فرض کنید در شکل زیر، بخواهید روی دو بردار با اندازه های متفاوت عملیات ریاضیاتی انجام دهید.
اگر در NumPy ویژگی broadcasting وجود نداشت، برای عملایت زیر مجبور بودیم یک حلقه به تعداد 3 بنویسیم و در هر تکرار یکی از مقادیر بردار a را با مقدار b ضرب میکردیم. حالا فرض کنید بردار a یک میلیون درایه دارد! حالا چی! در این صورت نیاز بود در پایتون یک حلقه بنویسیم با تعداد 1 میلیون!! خیلی زمانبر می شد. NumPy با ویژگی broadcasting آرایه دوم را هم اندازه آرایه اول میکند. و بعد عملیات را انجام میدهد و همین ویژگی باعث میشود سرعت عملیات بسیار بالا برود. در ویدیو کامل توضیح داده شده که شرایط broadcasting چی هست. در شکلهای زیر هم کاملا مشهود است.
دیدگاه ها