Table of Contents
NumPy چیست و چرا مهم است؟
در علم داده با پایتون، با «دادهٔ عددی زیاد» سروکار داریم: ماتریسها، جدولها، بردارها و …
کتابخانهٔ NumPy (نَمپای) ابزار استاندارد کار با دادههای عددی در پایتون است.
بهصورت خیلی خلاصه، NumPy سه کار اصلی برای ما انجام میدهد:
- نوع دادهٔ عددی جدیدی بهنام آرایهٔ NumPy (
ndarray) میدهد که شبیه «لیست چندبعدی» بسیار سریع و بهینه است. - عملیات ریاضی روی آرایهها را بهشکل برداری و ماتریسی انجام میدهد (بدون نیاز به حلقههای دستی).
- با سایر کتابخانههای علم داده (مثل
pandasوmatplotlib) خیلی خوب کار میکند.
در این بخش فقط با مفاهیم پایهٔ NumPy آشنا میشوید تا برای کارهای سادهٔ علمی و تمرین داده آماده شوید.
نصب و وارد کردن NumPy
اگر NumPy روی سیستمتان نصب نیست، معمولاً با pip نصب میشود:
pip install numpyدر کد پایتون، معمولترین روش وارد کردن NumPy این است:
import numpy as np
از این به بعد هر وقت مینویسیم np، یعنی داریم از NumPy استفاده میکنیم.
آرایههای NumPy (`ndarray`)
تفاوت آرایهٔ NumPy با لیست پایتون
لیست پایتون:
- میتواند انواع مختلف (عدد، رشته، …) را در یک لیست نگه دارد.
- برای محاسبات عددی سنگین کندتر است.
- عملهای ریاضی را خود لیست پشتیبانی نمیکند (باید برای هر عنصر جداگانه حساب کنیم).
آرایهٔ NumPy (ndarray):
- معمولاً همهٔ عناصرش از یک نوع عددی هستند (مثلاً همگی
float64). - برای محاسبات عددی روی حجم زیاد داده خیلی سریعتر است.
- میتوانید با یک خط، روی کل آرایه جمع، ضرب، ریشهگیری و … انجام دهید.
ساخت آرایههای 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 چند تابع آماده برای ساخت آرایههای پرکاربرد دارد:
np.zeros(shape)→ آرایهای پر از صفرnp.ones(shape)→ آرایهای پر از یکnp.full(shape, value)→ آرایهای پر از یک مقدار مشخصnp.eye(n)→ ماتریس همانی $n \times n$np.arange(start, stop, step)→ مثلrangeاما آرایهٔ NumPynp.linspace(start, stop, num)→numعدد بینstartوstop(بهطور یکنواخت)
مثال:
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) دارد که نشان میدهد چند بعد دارد و در هر بعد چند عنصر است.
- آرایهٔ یکبعدی: فقط طول دارد (مثلاً 4 عنصر).
- آرایهٔ دوبعدی: سطر × ستون.
- آرایههای بالاتر: بعد 1 × بعد 2 × بعد 3 × …
مثال:
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) # تعداد کل عناصر: 6shape→ یکtupleاز اندازهٔ هر بعدndim→ تعداد ابعادsize→ تعداد کل عناصر
دسترسی به عناصر و برش (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 توابع زیادی دارد که روی کل آرایه کار میکنند:
np.sqrt(arr)→ ریشهٔ دومnp.exp(arr)→ تابع نمایی $e^x$np.log(arr)→ لگاریتم طبیعیnp.sin(arr)،np.cos(arr)،np.tan(arr)و …
import numpy as np
x = np.array([1, 4, 9])
print(np.sqrt(x)) # [1. 2. 3.]
print(np.log(x)) # لگاریتم هر عنصرآمار ساده روی آرایهها
برای علم داده، آمار ساده بسیار مهم است. NumPy چند تابع پایه دارد:
arr.sum()→ مجموعarr.mean()→ میانگینarr.min()/arr.max()→ کمینه / بیشینهarr.std()→ انحراف معیارarr.var()→ واریانس
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()) # انحراف معیاربرای آرایههای دوبعدی میتوانید بگویید روی کدام محور (سطرها یا ستونها) حساب کند:
axis=0→ روی ستونهاaxis=1→ روی سطرها
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$ با شکل $(m, n)$
- $B$ با شکل $(n, p)$
آنوقت $A \times B$ ماتریسی با شکل $(m, p)$ است.
در NumPy برای ضرب ماتریسی از یکی از این دو روش استفاده میکنیم:
np.dot(A, B)- یا عملگر
@:A @ B
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
در ادامهٔ فصل علم داده با این دو کتابخانه آشنا میشوید، اما بد نیست بدانید:
pandasاغلب دادهها را داخلی بهصورت آرایههای NumPy نگه میدارد.matplotlibهم خیلی وقتها آرایههای NumPy را بهعنوان ورودی رسم میکند.
بنابراین اگر با 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 آشنا شدید:
- آرایهٔ
ndarrayو تفاوتش با لیست - ساخت آرایهها از لیست و با توابعی مثل
zeros,ones,arange,linspace - مفاهیم
shape,ndim,size - اندیسگذاری و برش ساده و دوبعدی
- عملیات برداری و توابع ریاضی آماده
- آمار ساده (
sum,mean, …) و پارامترaxis - فیلترکردن داده با ماسکهای بولی
reshapeبرای تغییر شکل آرایه- ضرب ماتریسی (
@وnp.dot) - تولید اعداد تصادفی با
np.random
در تمرینها و بخشهای بعدی علم داده، از همین ابزارهای NumPy بهعنوان پایه برای تحلیل و پردازش داده استفاده خواهیم کرد.