آشنایی با کتابخانه 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 با کمک کد زیر خیلی سریعتر انجام می شود.

سرعت محاسبات در c

این کد باعث صرف جویی در تمام هزینه های مربوط به تفسیر کدپایتون و دستکاری objectها می شود. اما به قیمت از دست دادند برنامه‌نویسی در محیط خوب پایتون!

 

Numpy بهترین هر دو را به ما میدهد!

عملیات نظیر به نظیر (درایه به درایه)، مود پیش فرض در ndarray است و این عملیات به خاطر اینکه از کدهای c از قبل کامپایل شده استفاده میکند، خیلی سریع انجام می شوند.

سرعت محاسبات در numpy

از لحاظ سادگی شبیه برنامه نویسی پایتون، و از لحاظ سرعت اجرا، شبیه زبان برنامه نویسی c است.

 

چرا numpy خوبه؟

کتابخانه numpy دو ویژگی  خیلی خوبی دارد و همین باعث قدرتمند شدن آن شده است. چرا که برنامه نویسی در محیط پایتون و کار با اعداد بسیار ساده و البته سریع کرده است.

Broadcasting و vectorization در نامپای

Broadcasting  و vectorization راهی برای سرعت بخشیدن به زمان محاسبات و بهینه کردن استفاده از فضای حافظه  در زمان عملیات ریاضیاتی در NumPy هستند.

مفهوم vectorization در نامپای

مفهوم vectorization در نامپای

Vectorization فرایندی است که در آن یک الگوریتم به جای اینکه روی تک تک مقادیر جداگانه کار کند، روی چندین مقدار (vector) همزمان عملیات انجام می‌دهد. و همین باعث میشود که ما در کار با آرایه‌های عددی در نامپای از حلقه استفاده نکنیم.  برای مثال در شکل زیر دو بردار سه مقداره باهم جمع می‌شوند. اگر بردارسازی نباشد، در این صورت لازم است که یک حلقه بنویسیم تا در هر تکرار روی یکی از مقادیر عملیات ریاضی را انجام دهد. در حالی که در کد برداری شده، این عملیات همزمان انجام می شود. البته همانطور که اشاره کردیم، حلقه در پشت صحنه به زبان c کامپایل شده، انجام میشود که سرعت بالایی دارد.

مزیتهای کد برداری شده (vectorized code)

  • کد برداری شده خلاصه است و درک آن راحتتره
  • خطوط برنامه نویسی کم یعنی باگ کمتر
  • کدها خیلی شبیه به علامتهای ریاضیاتی است. در نتیجه پیاده‌سازی روابط ریاضیاتی ساده تر خواهد بود.
  • بردارسازی باعث می‌شود که کد ما خیلی پایتونی (جمع و جور) باشه. بدون برداری باید با کلی حلقه سرو کار داشته باشیم.

 

مفهوم broadcasting در نامپای

Broadcasting  وسیله ای برای بردار کردن عملیات آرایه فراهم می کند به طوری که حلقه به جای پایتون در C انجام می شود.. این کار را بدون کپی از داده ها انجام می دهد و معمولاً به پیاده سازی الگوریتم های کارآمد منجر می شود.

فرض کنید در شکل زیر، بخواهید روی دو بردار با اندازه های متفاوت عملیات ریاضیاتی انجام دهید.

مفهوم broadcasting در نامپای

اگر در NumPy   ویژگی broadcasting وجود نداشت، برای عملایت زیر مجبور بودیم یک حلقه به تعداد 3 بنویسیم و در هر تکرار یکی از مقادیر بردار a را با مقدار b ضرب میکردیم. حالا فرض کنید بردار a یک میلیون درایه دارد! حالا چی! در این صورت نیاز بود در پایتون یک حلقه بنویسیم با تعداد 1 میلیون!! خیلی زمانبر می شد. NumPy با ویژگی broadcasting آرایه دوم را هم اندازه آرایه اول میکند. و بعد عملیات را انجام میدهد و همین ویژگی باعث میشود سرعت عملیات بسیار بالا برود. در ویدیو کامل توضیح داده شده که شرایط broadcasting چی هست. در شکلهای زیر هم کاملا مشهود است.

مفهوم broadcasting در نامپای

مفهوم broadcasting در نامپای

مفهوم broadcasting در نامپای

مفهوم broadcasting در نامپای




دیدگاه ها

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

code