Kahibaro
Discord Login Register

آشنایی با NumPy

NumPy چیست و چرا مهم است؟

در علم داده با پایتون، با «دادهٔ عددی زیاد» سروکار داریم: ماتریس‌ها، جدول‌ها، بردارها و …
کتابخانهٔ NumPy (نَم‌پای) ابزار استاندارد کار با داده‌های عددی در پایتون است.

به‌صورت خیلی خلاصه، NumPy سه کار اصلی برای ما انجام می‌دهد:

  1. نوع دادهٔ عددی جدیدی به‌نام آرایهٔ NumPy (ndarray) می‌دهد که شبیه «لیست چندبعدی» بسیار سریع و بهینه است.
  2. عملیات ریاضی روی آرایه‌ها را به‌شکل برداری و ماتریسی انجام می‌دهد (بدون نیاز به حلقه‌های دستی).
  3. با سایر کتابخانه‌های علم داده (مثل pandas و matplotlib) خیلی خوب کار می‌کند.

در این بخش فقط با مفاهیم پایهٔ NumPy آشنا می‌شوید تا برای کارهای سادهٔ علمی و تمرین داده آماده شوید.


نصب و وارد کردن NumPy

اگر NumPy روی سیستم‌تان نصب نیست، معمولاً با pip نصب می‌شود:

pip install numpy

در کد پایتون، معمول‌ترین روش وارد کردن NumPy این است:

import numpy as np

از این به بعد هر وقت می‌نویسیم np، یعنی داریم از NumPy استفاده می‌کنیم.


آرایه‌های NumPy (`ndarray`)

تفاوت آرایهٔ NumPy با لیست پایتون

لیست پایتون:

آرایهٔ NumPy (ndarray):

ساخت آرایه‌های NumPy

از لیست پایتون به آرایهٔ NumPy

ساده‌ترین راه ساخت آرایه: تبدیل یک لیست (یا لیستِ لیست‌ها) به آرایه:

import numpy as np
# آرایهٔ یک‌بعدی
list1 = [1, 2, 3, 4]
arr1 = np.array(list1)
print(arr1)
print(type(arr1))   # <class 'numpy.ndarray'>
# آرایهٔ دوبعدی (مثل ماتریس 2×3)
list2 = [
    [1, 2, 3],
    [4, 5, 6]
]
arr2 = np.array(list2)
print(arr2)

خروجی arr2 چیزی شبیه این است:

[[1 2 3]
 [4 5 6]]

ایجاد آرایه‌های خاص

NumPy چند تابع آماده برای ساخت آرایه‌های پرکاربرد دارد:

مثال:

import numpy as np
z = np.zeros((2, 3))     # 2 سطر، 3 ستون
o = np.ones((3, 3))
f = np.full((2, 2), 7)
e = np.eye(3)            # ماتریس همانی 3×3
a = np.arange(0, 10, 2)  # [0 2 4 6 8]
l = np.linspace(0, 1, 5) # 5 عدد از 0 تا 1
print(z)
print(a)
print(l)

شکل (Shape) و ابعاد (Dimensions)

هر آرایهٔ NumPy یک شکل (shape) دارد که نشان می‌دهد چند بعد دارد و در هر بعد چند عنصر است.

مثال:

import numpy as np
arr1 = np.array([1, 2, 3, 4])
arr2 = np.array([[1, 2, 3],
                 [4, 5, 6]])
print(arr1.shape)  # (4,)
print(arr2.shape)  # (2, 3)
print(arr1.ndim)   # تعداد ابعاد: 1
print(arr2.ndim)   # تعداد ابعاد: 2
print(arr2.size)   # تعداد کل عناصر: 6

دسترسی به عناصر و برش (Indexing & Slicing)

اندیس‌گذاری در آرایهٔ یک‌بعدی

تقریباً مانند لیست پایتون:

import numpy as np
arr = np.array([10, 20, 30, 40, 50])
print(arr[0])     # 10
print(arr[2])     # 30
print(arr[-1])    # 50 (آخرین عنصر)
# برش‌ها
print(arr[1:4])   # [20 30 40]
print(arr[:3])    # [10 20 30]
print(arr[2:])    # [30 40 50]

اندیس‌گذاری در آرایهٔ دوبعدی

در آرایهٔ دوبعدی، معمولاً از arr[row, col] استفاده می‌کنیم:

import numpy as np
arr = np.array([[1, 2, 3],
                [4, 5, 6]])
print(arr[0, 0])    # 1
print(arr[1, 2])    # 6
# یک سطر
print(arr[0, :])    # [1 2 3]
# یک ستون
print(arr[:, 1])    # [2 5]

عملیات برداری روی آرایه‌ها

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

عمل‌های حسابی روی کل آرایه

import numpy as np
a = np.array([1, 2, 3])
b = np.array([10, 20, 30])
print(a + b)      # [11 22 33]
print(b - a)      # [ 9 18 27]
print(a * b)      # [10 40 90]
print(b / a)      # [10. 10. 10.]
print(a + 5)      # [6 7 8]  اضافه کردن عدد به همهٔ عناصر
print(a * 2)      # [2 4 6]  ضرب همهٔ عناصر در 2

این روش را «محاسبات برداری» می‌گویند و برای داده‌های علمی بسیار پرکاربرد است.

توابع ریاضی آماده

NumPy توابع زیادی دارد که روی کل آرایه کار می‌کنند:

import numpy as np
x = np.array([1, 4, 9])
print(np.sqrt(x))     # [1. 2. 3.]
print(np.log(x))      # لگاریتم هر عنصر

آمار ساده روی آرایه‌ها

برای علم داده، آمار ساده بسیار مهم است. NumPy چند تابع پایه دارد:

import numpy as np
data = np.array([1, 2, 3, 4, 5])
print(data.sum())   # 15
print(data.mean())  # 3.0
print(data.min())   # 1
print(data.max())   # 5
print(data.std())   # انحراف معیار

برای آرایه‌های دوبعدی می‌توانید بگویید روی کدام محور (سطرها یا ستون‌ها) حساب کند:

import numpy as np
m = np.array([[1, 2, 3],
              [4, 5, 6]])
print(m.sum())             # مجموع همهٔ عناصر
print(m.sum(axis=0))       # مجموع ستون‌ها → [5 7 9]
print(m.sum(axis=1))       # مجموع سطرها → [6 15]

برش پیشرفته: ماسک‌های بولی (Boolean Masking)

با «شرط» روی آرایه می‌توانید یک ماسک بولی بسازید و فقط داده‌های مطابق شرط را انتخاب کنید. این برای فیلترکردن داده در علم داده بسیار مهم است.

import numpy as np
data = np.array([10, 20, 30, 40, 50])
mask = data > 25
print(mask)           # [False False  True  True  True]
filtered = data[mask]
print(filtered)       # [30 40 50]
# مستقیم در یک خط
print(data[data % 20 == 0])  # اعدادی که بر 20 بخش‌پذیرند

در آرایه‌های دوبعدی نیز می‌توانید از این روش استفاده کنید.


تغییر شکل آرایه‌ها (Reshape)

گاهی لازم است داده‌ها را از یک شکل به شکل دیگری تبدیل کنیم، بدون تغییر در خود مقادیر.

تابع reshape این کار را انجام می‌دهد، تا وقتی که تعداد کل عناصر ثابت بماند.

import numpy as np
arr = np.arange(12)    # [0 1 2 3 4 5 6 7 8 9 10 11]
print(arr.shape)       # (12,)
m = arr.reshape(3, 4)
print(m)
print(m.shape)         # (3, 4)
# تبدیل به 4×3
m2 = arr.reshape(4, 3)
print(m2)

اگر شکل ناسازگار انتخاب کنید (مثلاً بخواهید ۱۲ عنصر را به آرایهٔ ۵×۵ تبدیل کنید)، خطا می‌گیرید.


عملیات ماتریسی (مقدماتی)

در علم داده خیلی وقت‌ها با ماتریس‌ها کار می‌کنیم. NumPy امکاناتی برای ضرب ماتریسی دارد.

فرض کنید دو ماتریس داریم:

آن‌وقت $A \times B$ ماتریسی با شکل $(m, p)$ است.

در NumPy برای ضرب ماتریسی از یکی از این دو روش استفاده می‌کنیم:

import numpy as np
A = np.array([[1, 2],
              [3, 4]])
B = np.array([[5, 6],
              [7, 8]])
C = A @ B       # یا np.dot(A, B)
print(C)

ضرب عنصر به عنصر (در مقابل ضرب ماتریسی) همان A * B است که فقط هر عنصر را در عنصر متناظر ضرب می‌کند.


تولید اعداد تصادفی (مقدماتی)

NumPy یک زیرماژول برای اعداد تصادفی دارد: np.random. (برای جزئیات بیشتر، فصل کتابخانه‌ها و علم داده ادامه می‌دهد.)

چند مثال ساده:

import numpy as np
# 5 عدد تصادفی با توزیع یکنواخت بین 0 و 1
r = np.random.rand(5)
# آرایهٔ 2×3 از اعداد تصادفی بین 0 و 1
r2 = np.random.rand(2, 3)
# 5 عدد صحیح تصادفی بین 0 و 9
i = np.random.randint(0, 10, size=5)
print(r)
print(r2)
print(i)

این قابلیت برای شبیه‌سازی‌ها، آزمایش الگوریتم‌ها و تولید دادهٔ نمونه مفید است.


ارتباط NumPy با pandas و matplotlib

در ادامهٔ فصل علم داده با این دو کتابخانه آشنا می‌شوید، اما بد نیست بدانید:

بنابراین اگر با NumPy راحت باشید، کار با pandas و matplotlib برای‌تان طبیعی‌تر می‌شود.

مثلاً یک مثال خیلی ساده رسم با matplotlib (فقط برای نشان دادن ارتباط؛ توضیح کامل در فصل مربوط به مصورسازی می‌آید):

import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0, 2*np.pi, 100)
y = np.sin(x)
plt.plot(x, y)
plt.show()

جمع‌بندی

در این بخش با مفاهیم پایهٔ NumPy آشنا شدید:

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

Views: 6

Comments

Please login to add a comment.

Don't have an account? Register now!