اگر به عنوان یک برنامهنویس از پایتون برای توسعه استفاده کرده باشید، قطعا از وجود کتابخانههای متنوع و کاربردی در این زبان محبوب اطلاع دارید. حال اگر در این بین نیاز به کمی محاسبات ریاضی داشته باشید، اولین گزینههای پیش روی شما math و نامپای (NumPy) هستند. این دو کتابخانه در ظاهر اهداف مشترکی را دنبال میکنند اما اگر کمی عمیقتر به این دو نگاه کنید، متوجه خواهید شد که اختلاف این دو فراتر از حد انتظارتان است. در این مقاله سعی میکنیم همه چیز را در مورد NumPy بررسی کنیم.
کتابخانه NumPy چیست؟
نامپای یک کتابخانه پایتون برای انجام محاسبات علمی و عددی است که دارای ابزارهای کارآمد برای کارکردن با آرایهها و ماتریسهاست. NumPy با در اختیار داشتن تعداد زیادی از توابع ریاضی و آماری، سرعت بالا و امکاناتی که به صورت رایگان دراختیار برنامهنویسان قرار میدهد، به یکی از پرکاربردترین ابزارها در پایتون بدل شده است.
تاریخچه نامپای
زبان برنامهنویسی پایتون در بدو معرفی، به هیچ وجه برای محاسبات عددی طراحی نشده بود. اما به دلیل داشتن مزایای بسیار، مورد توجه جامعه علمی و مهندسی قرار گرفت. برای همین در سال ۱۹۹۵ یک گروه به نام (matrix-sig) با هدف ساخت یک کتابخانه محاسبات آرایهای شکل گرفت. یکی از اعضای این گروه هم که خود از طراحهای زبان پایتون بود، سینتکس پایتون را به گونهای گسترش داد تا محاسبات آرایهای را به کمک این زبان، سادهتر کند.
بدین ترتیب اولین نسخه این کتابخانه با نام Numeric برای پایتون ساخته شد. پس از مدتی یک نسخه انعطافپذیرتر به نام Numarray از این کتابخانه منتشر شد. مزیت این نسخه سرعت محاسبات بیشتر در آرایههای بزرگ بود اما همچنان در انجام عملیات روی آرایههای کوچک، کندتر از Numeric عمل میکرد. به همین خاطر تا مدتی این دو نسخه به صورت مجزا برای کاربریهای مختلف به کار گرفته میشدند. آخرین نسخه Numarray در سال ۲۰۰۶ منتشر شد.
کمی پیش از انتشار آخرین نسخه Numarray و در سال ۲۰۰۵، سازنده نامپای ویژگیهای Numarray را به Numeric منتقل و در سال ۲۰۰۶، اولین نسخه از این کتابخانه جدید را با نام NumPy 1.0 منتشر کرد.
نحوه استفاده از نامپای
برخلاف کتابخانه math که به صورت پیشفرض در خود پایتون در دسترس است، برای استفاده از NumPy ابتدا نیاز است آن را دانلود و نصب کنید. بدین منظور میتوانید از دستور زیر در کنسول یا ترمینال دستگاه خود استفاده کنید:
pip install numpy;
با اجرای این دستور، به صورت خودکار آخرین نسخه کتابخانه NumPy دانلود و نصب میشود.
پس از نصب میتوانید با دستور زیر در کد پایتون، از این کتابخانه نهایت استفاده را ببرید:
import numpy
همچنین میتوانید به جای دستور بالا، با اضافه کردن (as np) به آخر دستور، آن را به عنوان np فراخوانی کنید تا کدی کوتاهتر و خواناتر بنویسید:
import numpy as np
ویژگیها و مزایای نامپای
نامپای در حال حاضر بخشی جداییناپذیر از جامعه برنامهنویسی دنیا است که با قابلیتها و امکاناتی که در اختیار توسعهدهندگان قرار میدهد، باعث شده باعث سادهتر شدن فرایند نوشتن کدهای پیچیده و محاسبات طولانی شده است. از جمله ویژگیهای مهم این کتابخانه محبوب میتوانیم به موارد زیر اشاره کنیم:
۱- آرایههای چند بعدی (ndarray)
اصلیترین ویژگی نامپای، آرایههای چند بعدی یا ndrray است که امکان ذخیرهسازی و عملیاتهای کارآمد را روی دادههای چند بعدی فراهم میکند. همچنین این آرایهها از نظر حافظه بسیار بهینه و سریع هستند.
۲- عملیات برداری (Vector)
نامپای از عملیات برداری پشتیبانی میکند که امکان انجام محاسبات ریاضی بر روی آرایهها را بدون استفاده از حلقههای پیچیده فراهم میکند.
۳- توابع ریاضی
مجموعهای از توابع ریاضی مانند جمع، تفریق، ضرب، تقسیم، توابع مثلثاتی، لگاریتمی و غیره در این کتابخانه گنجانده شده تا برنامهنویس، هیچ کمبودی را در این زمینه احساس نکند.
۴- شاخصگذاری و برش (Slicing and Indexing)
پایتون به صورت پیشفرض قابلیتهای slice و index را برای دسترسی به اجزای خاص یکعنصر فراهم میکند. اما نامپای هم به صورت اختصاصی امکانات قدرتمندی را برای دسترسی به اجزای آرایهها به وسیله شاخصگذاری و برشهای پیچیده فراهم میکند. همچنین قابلیت فیلترکردن هر آرایه بر اساس شرطهای منطقی هم در نامپای ارائه میشود.
۵- توابع جبر خطی
این کتابخانه شامل توابعی است که برای عملیات جبر خطی مانند ضرب ماتریس، وارون کردن ماتریس، دترمینان و غیره استفاده میشود.
۶- تبدیلات فوریه
در ریاضیات تبدیل فوریه یک نوع تبدیل ریاضیاتی است که توابعی را که برحسب زمان یا فضا هستند، به توابعی برحسب فرکانس زمانی یا فضایی تجزیه میکند. امکان انجام تبدیلات فوریه برای تحلیل سیگنالها و دادههای زمانی در نامپای بسیار کاربردی است.
۷- تولید دادههای تصادفی
یکی از مباحث اساسی در برنامهنویسی و تحلیل دادهها، تولید دادههای تصادفی است که در مسائلی مانند شبیهسازی، بازیها، تست و اعتبارسنجی مدلها استفاده میشود. امکان تولید اینگونه دادهها از طریق توابع تعریف شده در نامپای به سادگی قابل انجام است.
۸- پشتیبانی از انواع دادهها
پایه و اساس ریاضیات و محاسبات از اعداد مختلف نشات میگیرد. از این سو پشتیبانی از دادههای متنوع مانند اعداد صحیح، اعشاری، مختلط و غیره از جمله قابلیتهای گنجانده شده در این کتابخانه است.
دلیل سرعت بیشتر نامپای چیست؟
امروزه از پایتون به عنوان یک زبان سطح بالا و پیشرفته یاد میشود. اما فارغ از داشتن مزایای بسیار، عیبی که بیشتر از هرچیز در پایتون به چشم میخورد سرعت آن نسبت به رقبا است. به دلایل مختلفی از جمله تفسیری بودن، مدیریت حافظه خودکار، بهینهسازی کمتر در زمان اجرا و غیره، پایتون سرعت کمتری نسبت به زبانی مانند C دارد.
کتابخانه NumPy به دلیل استفاده از تکنیکها و ساختارهای دادهای بهینهسازی شده، در بخش آرایههای چند بعدی از نظر حافظه مطلوب و سریع است. در ادامه به دلایلی که باعث میشود نامپای بهینه و سریع باشد اشاره میکنیم:
۱- استفاده از آرایههای ثابت و یکنواخت
آرایههای استفاده شده در نامپای از نوع دادههای ثابت و یکنواخت هستند. به این معنا که همه عناصر درون آرایه دارای نوع داده یکسان هستند (مانند اعداد اعشاری، صحیح و غیره). این ویژگی باعث میشود که حافظه به صورت پیوسته اختصاص یابد و عملیات بر روی آرایهها سریعتر انجام شود، زیرا پایتون نیازی به بررسی نوع داده هر عنصر به صورت مجزا ندارد.
۲- استفاده از C و Fortran در پیادهسازی توابع
بسیاری از توابع و عملیاتها در نامپای به زبانهای C و Fortran پیادهسازی شدهاند. این دو زبان نسبت به پایتون کارایی و سرعت بالاتری دارند و باعث میشوند عملیات ریاضی و محاسباتی با سرعت بیشتری انجام شود. رایجترین روش استفاده از این تکنیک در پایتون، نوشتن افزونههایی به صورت ماژول است که به وسیله import به پایتون وارد میشوند. (برای اطلاعات بیشتر در مورد برنامهنویسی ماژولار میتوانید به این مقاله سر بزنید.)
۳- مدیریت حافظه کارآمد
نامپای از تکنیکهای بهینهسازی حافظه مانند تخصیص پیوسته و دسترسی مستقیم به حافظه استفاده میکند. این تکنیکها باعث کاهش overhead حافظه و افزایش سرعت دسترسی به دادهها میشوند.
۴- عملیات برداری (Vectorized Operations)
به دلیل پشتیبانی نامپای از عملیاتهای برداری، این امکان وجود دارد که بسیاری از عملیاتهای ریاضی به صورت همزمان بر روی تمامی عناصر یک آرایه اعمال شوند. این ویژگی نهتنها کد را سادهتر و خواناتر میکند، بلکه باعث افزایش کارایی هم میشود.
۵- استفاده از کتابخانههای بهینهسازی شده خارجی
کتابخانههایی مانند BLAS و LAPACK که به دلیل اعمال بهینهسازیهای مختلف، عملیات پیچیده ریاضی مانند ضرب ماتریس و محاسبات جبر خطی را با کارایی بالا انجام میدهند. در نتیجه استفاده از آنها در نامپای باعث شده سرعت انجام محاسبات بیش از پیش افزایش پیدا کند.
۶- کاهش نیاز به حلقههای پایتون
بسیاری از محاسباتی که در پایتون نیاز به حلقههای تکرارشونده دارند، میتوانند به صورت مستقیم و بدون استفاده از حلقهها انجام شوند که باعث کاهش زمان اجرای برنامهها میشود.
۷- استفاده از قابلیتهای SIMD
SIMD مخفف «Single Instruction, Multiple Data» به معنی: (یک دستور، دادههای چندگانه) است. این یک تکنیک پردازشی در معماری کامپیوتر به شمار میرود که به یک واحد پردازشی اجازه میدهد تا یک دستور را بر روی چندین داده به صورت همزمان اعمال کند. این امر باعث اجرای هر چه سریعتر برنامهها میشود.
Math بهتر است یا NumPy؟
انتخاب میان این این دو کتابخانه کاملا به نیاز شما بستگی دارد. در اینجا به برخی از تفاوتهای کلیدی این دو کتابخانه میپردازیم تا بتوانید براساس نیاز خود بهترین گزینه را انتخاب کنید.
- عملکرد: نامپای به دلیل استفاده از زبان C و سایر بهینهسازیهای داخلی عملکرد بهتری نسبت به math دارد.
- دادهها: نامپای از آرایههای چند بعدی پشتیبانی میکند درحالی که math تنها توابعی برای محاسبات تکبعدی ارائه میکند.
- توابع: نامپای شامل مجموعه گستردهای از توابع ریاضی و آماری است، درحالی که math فقط توابع پایه را ارائه میدهد.
بنابراین انتخاب بین NumPy و math به پیچیدگی کار و نوع محاسبات شما بستگی دارد. اگر به محاسبات علمی پیچیده و کار با آرایههای چند بعدی نیازمندید، نامپای میتواند گزینهای مناسب و پرقدرت برای شما باشد. اما اگر نیاز شما در حد محاسبات پایه و ساده است که نیازی به توابع پیچیده و آرایههای چند بعدی ندارد، math برای رفع نیازتان کافی خواهد بود.
سخن پایانی
نامپای تا به امروز نشان داده که یک ابزار بهروز و کارآمد در زمینه محاسبات است. این کتابخانه با دریافت به روزرسانیهای مختلف و آپدیتهای جدید، لحظه به لحظه به تکامل بیش از پیش خود ادامه خواهد داد تا کار را برای جامعه برنامهنویسی و دانشمندان راحتتر کند. از این رو یاد گرفتن کار با این کتابخانه محبوب خالی از لطف نیست و برتری قابل ملاحظهای را برای شما در برابر کدهای سخت و محاسبات پیچیده به همراه دارد.
دیدگاهتان را بنویسید