numpy#

مقدمه#

در دنیای امروز، داده‌ها و محاسبات عددی نقش اساسی در پیشبرد علوم و فناوری ایفا می‌کنند. از تحلیل داده‌های بزرگ گرفته تا شبیه‌سازی‌های پیچیده‌ی علمی، نیاز به ابزارهایی کارآمد و سریع برای پردازش و محاسبات عددی بیش از پیش احساس می‌شود. در این میان، کتابخانه‌های برنامه‌نویسی مانند NumPy به عنوان یکی از ابزارهای قدرتمند و پرکاربرد در زبان پایتون، جایگاه ویژه‌ای دارند.

NumPy (مخفف Numerical Python) یک کتابخانه‌ی متن‌باز و قدرتمند است که برای انجام عملیات‌های عددی و علمی در پایتون طراحی شده است. هسته‌ی اصلی این کتابخانه، ساختار داده‌ای به نام آرایه (Array) است که امکان ذخیره‌سازی و پردازش حجم عظیمی از داده‌ها را به صورت کارآمد فراهم می‌کند. آرایه‌ها در NumPy به دلیل سادگی و سرعت بالا، به یکی از ابزارهای ضروری در محاسبات عددی تبدیل شده‌اند.

اهمیت استفاده از آرایه‌ها در برنامه‌نویسی و محاسبات عددی#

  1. کارایی و سرعت بالا: آرایه‌ها در NumPy به گونه‌ای طراحی شده‌اند که عملیات‌های ریاضی و محاسباتی را با سرعت بسیار بالاتری نسبت به لیست‌های معمولی پایتون انجام می‌دهند. این افزایش سرعت به دلیل استفاده از الگوریتم‌های بهینه‌شده و پیاده‌سازی‌های سطح پایین در NumPy است.

  2. حافظه‌ی بهینه: آرایه‌ها در NumPy به صورت فشرده و با استفاده از ساختارهای داده‌ای کارآمد ذخیره می‌شوند. این امر باعث کاهش مصرف حافظه و افزایش کارایی در پردازش داده‌های حجیم می‌شود.

  3. سهولت در انجام عملیات‌های برداری: یکی از قابلیت‌های کلیدی NumPy، پشتیبانی از عملیات‌های برداری (Vectorized Operations) است. این ویژگی به شما امکان می‌دهد عملیات‌های ریاضی را بر روی کل آرایه‌ها بدون نیاز به نوشتن حلقه‌های پیچیده انجام دهید. این امر نه تنها کد را ساده‌تر می‌کند، بلکه سرعت اجرا را نیز به طور چشمگیری افزایش می‌دهد.

  4. پشتیبانی از محاسبات ماتریسی: در بسیاری از زمینه‌های علمی و مهندسی، محاسبات ماتریسی از اهمیت بالایی برخوردار است. NumPy با ارائه‌ی توابع و ابزارهای قدرتمند برای کار با ماتریس‌ها، انجام این محاسبات را تسهیل می‌کند.

  5. یکپارچگی با سایر کتابخانه‌ها: NumPy به عنوان پایه‌ی بسیاری از کتابخانه‌های علمی پایتون مانند SciPy, Pandas, Matplotlib و Scikit-learn عمل می‌کند. این یکپارچگی باعث می‌شود که بتوانید به راحتی از قابلیت‌های NumPy در کنار سایر ابزارهای تحلیلی و بصری‌سازی استفاده کنید.

مثال: مشتق عددی با numpy#

در این بخش، کدهایی که در کلاس اجرا شده‌اند را به همراه توضیحات کامل و اشاره به امکانات بیشتر در NumPy بررسی می‌کنیم. همچنین در انتها دو سوال مناسب برای دانشجویان ارائه شده است.


۱. وارد کردن کتابخانه‌ها و ایجاد داده‌ها#

import numpy as np

در این خط، کتابخانه‌ی NumPy با نام مستعار np وارد می‌شود. این نام مستعار به طور گسترده‌ای در جامعه‌ی علمی پایتون استفاده می‌شود و باعث کوتاه‌تر و خوانا‌تر شدن کد می‌شود.

x = np.arange(0,np.pi,0.01)

تابع np.arange برای ایجاد یک آرایه‌ی یک‌بعدی از اعداد استفاده می‌شود. در اینجا، آرایه‌ی x از ۰ شروع می‌شود و تا np.pi (عدد پی) با گام‌های ۰٫۰۱ ادامه می‌یابد. این آرایه شامل مقادیر متوالی و یکنواخت است.

y = np.sin(x)

تابع np.sin به صورت برداری (بر روی کل آرایه) عمل می‌کند و سینوس هر عنصر در آرایه‌ی x را محاسبه می‌کند. نتیجه در آرایه‌ی y ذخیره می‌شود.

print( x[0:5] , y[0:5] , len(x))
[0.   0.01 0.02 0.03 0.04] [0.         0.00999983 0.01999867 0.0299955  0.03998933] 315

این خط مقادیر x، y و طول آرایه‌ی x را چاپ می‌کند. این کار برای بررسی اولیه‌ی داده‌ها مفید است.


۲. محاسبه‌ی مشتق عددی به روش تفاضل محدود#

yprime = np.zeros(len(x)-1)

یک آرایه‌ی خالی به نام yprime با طول len(x)-1 ایجاد می‌شود. این آرایه برای ذخیره‌ی مقادیر مشتق استفاده خواهد شد.

for i in range(len(x)-1):
  yp = y[i+1] - y[i]
  yp /= x[i+1] - x[i]
  yprime[i] = yp

در این حلقه، مشتق عددی به روش تفاضل محدود (Finite Difference) محاسبه می‌شود. برای هر نقطه، تفاضل مقدار تابع (y[i+1] - y[i]) بر تفاضل مقادیر x (x[i+1] - x[i]) تقسیم می‌شود. این مقدار در آرایه‌ی yprime ذخیره می‌شود.


۳. استفاده از توابع NumPy برای محاسبه‌ی مشتق#

dx = np.diff(x)
print(dx[0:5])
[0.01 0.01 0.01 0.01 0.01]

تابع np.diff تفاضل بین عناصر متوالی آرایه‌ی x را محاسبه می‌کند. نتیجه در آرایه‌ی dx ذخیره می‌شود.

yroll = np.roll(y , 1)

تابع np.roll آرایه‌ی y را به اندازه‌ی ۱ عنصر به جلو می‌چرخاند. این کار برای محاسبه‌ی تفاضل بین عناصر متوالی مفید است.

dy = y - yroll

تفاضل بین آرایه‌ی اصلی y و آرایه‌ی چرخانده‌شده (yroll) محاسبه می‌شود. نتیجه در آرایه‌ی dy ذخیره می‌شود.

yprime2 = dy[1:]/dx

مشتق عددی با استفاده از تفاضل‌های محاسبه‌شده (dy) و dx محاسبه می‌شود. نتیجه در آرایه‌ی yprime2 ذخیره می‌شود.


۴. رسم نمودارها با استفاده از Matplotlib#

import matplotlib.pyplot as plt
plt1 = plt.plot(x , y , label='function')
plt.plot(x[:-1] , yprime , '-.' , color = 'red' , label = 'diff-1')
plt.plot(x[:-1] , yprime2 , '-' , color = 'blue' , label = 'diff-2' , alpha=0.20 , linewidth=2 )

plt.legend()
<matplotlib.legend.Legend at 0x7fce2da0c4c0>
../_images/79726ec9ae3582c0bcb1a3a1c5b99f2a9d2e99f7e47263359f3fc53cb7336081.png

کتابخانه‌ی matplotlib.pyplot برای رسم نمودارها وارد می‌شود.

نمودار تابع اصلی (y = sin(x)) رسم می‌شود. برچسب ’function’ برای این نمودار تعیین می‌شود.

نمودار مشتق محاسبه‌شده به روش تفاضل محدود (yprime) رسم می‌شود. این نمودار با خط چین (’-.’) و رنگ قرمز (color=’red’) نمایش داده می‌شود.

نمودار مشتق محاسبه‌شده با استفاده از توابع NumPy (yprime2) رسم می‌شود. این نمودار با خط پیوسته (’-’) و رنگ آبی (color=’blue’) نمایش داده می‌شود. همچنین شفافیت (alpha=0.20) و ضخامت خط (linewidth=2) تنظیم شده‌اند.

یک راهنمای نمودار (legend) اضافه می‌شود تا برچسب‌های هر نمودار نمایش داده شوند.


امکانات بیشتر در NumPy#

محاسبه‌ی مشتق با استفاده از np.gradient:

NumPy تابع np.gradient را ارائه می‌دهد که می‌تواند مشتق یک تابع را به صورت خودکار محاسبه کند. این تابع برای محاسبه‌ی مشتق در چندین بعد نیز کاربرد دارد.

بهینه‌سازی محاسبات با np.vectorize:

اگر تابعی دارید که به صورت برداری عمل نمی‌کند، می‌توانید از np.vectorize استفاده کنید تا آن تابع را به صورت برداری اجرا کنید.

سوالات#

سوال ۱: روش‌های دقیق‌تر مشتق‌گیری#

روش تفاضل محدود (Finite Difference) که در این کد استفاده شده است، یک روش ساده برای محاسبه‌ی مشتق است. آیا می‌توانید روش‌های دقیق‌تری مانند تفاضل مرکزی (Central Difference) یا تفاضل پس‌رو و پیش‌رو (Backward/Forward Difference) را پیاده‌سازی کنید؟ مزایا و معایب هر روش چیست؟

سوال ۲: خطای روش‌های مشتق‌گیری#

در روش تفاضل محدود، خطای محاسباتی به دلیل گسسته‌سازی (Discretization) وجود دارد. چگونه می‌توانید خطای این روش را محاسبه و تحلیل کنید؟ آیا می‌توانید با تغییر گام (step size) در آرایه‌ی x، تأثیر آن بر دقت مشتق‌گیری را بررسی کنید؟

سوال ۳: مشتق تابع چند متغیره#

تابع \(f(x,y) = sin(x\times y)\) را در بازه‌ی \(-\pi/2 < x < \pi/2 , -\pi/2 < y < \pi/2\) تشکیل دهید. با استفاده از np.gradient:

  • مشتق این تابع نسبت به \(x\) را در \(y=\pi/4\) رسم کنید.

  • مشتق دوم این تابع نسبت به \(x\) و \(y\) را رسم کنید.

جمع‌بندی#

استفاده از آرایه‌ها در برنامه‌نویسی و محاسبات عددی، به ویژه در حوزه‌هایی مانند علم داده، هوش مصنوعی، فیزیک، مهندسی و بسیاری دیگر، امری ضروری است. NumPy با ارائه‌ی ساختار داده‌ای کارآمد و توابع قدرتمند، به یکی از ابزارهای اصلی برای انجام این محاسبات تبدیل شده است. یادگیری و تسلط بر این کتابخانه نه تنها سرعت و دقت محاسبات شما را افزایش می‌دهد، بلکه درک بهتری از مفاهیم پایه‌ای در محاسبات عددی را نیز به شما می‌بخشد.

در ادامه، با بررسی دقیق‌تر قابلیت‌های NumPy و نحوه‌ی استفاده از آن، می‌توانید به توانمندی‌های بیشتری در زمینه‌ی پردازش داده‌ها و محاسبات علمی دست یابید.

Note

البته numpy انتهای داستان نیست! گروه‌های مختلف ابزارهای بسیار حرفه‌ای و دقیقی بر مبنای numpy نوشته اند. به عنوان نمونه به پکیج findiff برای مشتق گیری های پیچیده مراجعه کنید.