NumPy یکی از کتابخانههای قدرتمند و پرکاربرد در زبان برنامهنویسی پایتون است که بهطور ویژه برای انجام محاسبات علمی و کار با دادههای عددی طراحی شده است. این کتابخانه با ارائه ساختار دادهای به نام آرایه (Array)، امکان انجام عملیات پیچیده ریاضی و آماری را با سرعت و کارایی بالا فراهم میکند. آرایههای NumPy نه تنها از نظر عملکرد بهینهتر از لیستهای معمولی پایتون هستند، بلکه امکانات گستردهای برای دستکاری و پردازش دادهها ارائه میدهند.
دستکاری آرایهها در NumPy یکی از مهارتهای اساسی برای هر کسی است که با دادهها و محاسبات علمی سروکار دارد. از ایجاد و تغییر شکل آرایهها تا انجام عملیات ریاضی و منطقی، NumPy ابزارهای متنوعی را در اختیار شما قرار میدهد. در این مقاله، به بررسی روشهای مختلف دستکاری آرایهها در NumPy میپردازیم و با مثالهای عملی، نحوه استفاده از این ابزارها را نشان خواهیم داد.
هدف این مقاله این است که شما را با مفاهیم پایه و پیشرفته دستکاری آرایهها در NumPy آشنا کند و به شما کمک کند تا از این ابزارها بهطور مؤثر در پروژههای خود استفاده کنید. در ادامه، به بررسی روشهای ایجاد آرایهها، تغییر شکل آنها، ادغام و تقسیم آرایهها، و انجام عملیات ریاضی و منطقی خواهیم پرداخت.
آشنایی با آرایهها در NumPy
آرایهها در NumPy ساختار دادهای هستند که برای ذخیره و پردازش مجموعهای از عناصر همنوع استفاده میشوند. این عناصر میتوانند اعداد صحیح، اعشاری، یا حتی دادههای پیچیدهتر باشند. آرایههای NumPy برخلاف لیستهای معمولی پایتون، از نظر عملکرد و کارایی بسیار بهینهتر هستند و به شما امکان انجام عملیات برداری (Vectorized Operations) را میدهند. این ویژگی باعث میشود که محاسبات روی آرایهها با سرعت بسیار بیشتری نسبت به لیستها انجام شود.
تفاوت آرایههای NumPy با لیستهای پایتون
- همنوع بودن عناصر: در آرایههای NumPy، تمام عناصر باید از یک نوع داده باشند (مثلاً همه اعداد صحیح یا همه اعداد اعشاری). این در حالی است که در لیستهای پایتون، عناصر میتوانند از انواع مختلف باشند.
- عملکرد بهینه: آرایههای NumPy برای انجام عملیات ریاضی و منطقی بهینهسازی شدهاند و از کتابخانههای سطح پایین مانند C استفاده میکنند. این باعث میشود که عملیات روی آرایهها بسیار سریعتر از لیستها انجام شود.
- ابعاد و شکل: آرایههای NumPy میتوانند چندبعدی باشند، در حالی که لیستهای پایتون بهطور پیشفرض یکبعدی هستند. این ویژگی به شما امکان کار با ماتریسها و تنسورها را میدهد.
ویژگیهای اصلی آرایهها
- ابعاد (Dimensions): آرایهها میتوانند یکبعدی، دوبعدی، یا چندبعدی باشند. به عنوان مثال، یک آرایه یکبعدی میتواند یک بردار باشد، در حالی که یک آرایه دوبعدی میتواند یک ماتریس باشد.
- شکل (Shape): شکل یک آرایه به شما میگوید که آرایه در هر بعد چند عنصر دارد. به عنوان مثال، یک آرایه دوبعدی با شکل (3, 4) دارای ۳ سطر و ۴ ستون است.
- نوع داده (dtype): نوع داده عناصر آرایه را مشخص میکند. به عنوان مثال،
int32
برای اعداد صحیح ۳۲ بیتی وfloat64
برای اعداد اعشاری ۶۴ بیتی استفاده میشود. - اندازه (Size): تعداد کل عناصر موجود در آرایه را نشان میدهد. به عنوان مثال، یک آرایه با شکل (3, 4) دارای اندازه ۱۲ است.
در بخش بعدی، به روشهای ایجاد و مقداردهی اولیه آرایهها در NumPy خواهیم پرداخت.
ایجاد و مقداردهی اولیه آرایهها در NumPy
یکی از اولین قدمها در کار با NumPy، ایجاد آرایهها است. NumPy روشهای مختلفی برای ایجاد آرایهها ارائه میدهد که بسته به نیاز شما میتوانید از آنها استفاده کنید. در این بخش، به بررسی برخی از متداولترین روشهای ایجاد و مقداردهی اولیه آرایهها میپردازیم.
۱. ایجاد آرایه از لیستهای پایتون
سادهترین روش برای ایجاد یک آرایه در NumPy، استفاده از تابع np.array()
است. این تابع یک لیست پایتون را به عنوان ورودی میگیرد و آن را به یک آرایه NumPy تبدیل میکند.
import numpy as np
# ایجاد یک آرایه یکبعدی از یک لیست
arr = np.array([1, 2, 3, 4, 5])
print(arr)
خروجی:
[1 2 3 4 5]
همچنین میتوانید آرایههای چندبعدی را از لیستهای تو در تو ایجاد کنید:
# ایجاد یک آرایه دوبعدی (ماتریس)
arr_2d = np.array([[1, 2, 3], [4, 5, 6]])
print(arr_2d)
خروجی:
[[1 2 3]
[4 5 6]]
۲. ایجاد آرایههای پر از صفر یا یک
گاهی اوقات نیاز دارید آرایههایی ایجاد کنید که تمام عناصر آنها صفر یا یک باشند. NumPy توابعی مانند np.zeros()
و np.ones()
را برای این منظور ارائه میدهد.
# ایجاد یک آرایه یکبعدی پر از صفر
zeros_arr = np.zeros(5)
print(zeros_arr)
# ایجاد یک آرایه دوبعدی پر از یک
ones_arr = np.ones((3, 3))
print(ones_arr)
خروجی:
[0. 0. 0. 0. 0.]
[[1. 1. 1.]
[1. 1. 1.]
[1. 1. 1.]]
۳. ایجاد آرایهها با استفاده از np.arange()
تابع np.arange()
شبیه به تابع range()
در پایتون است، اما به جای لیست، یک آرایه NumPy برمیگرداند. این تابع برای ایجاد آرایههایی با اعداد متوالی مفید است.
# ایجاد یک آرایه با اعداد از ۰ تا ۹
arr_range = np.arange(10)
print(arr_range)
# ایجاد یک آرایه با اعداد از ۵ تا ۱۵ با گام ۲
arr_range_step = np.arange(5, 15, 2)
print(arr_range_step)
خروجی:
[0 1 2 3 4 5 6 7 8 9]
[ 5 7 9 11 13]
۴. ایجاد آرایهها با استفاده از np.linspace()
تابع np.linspace()
برای ایجاد آرایههایی با اعداد متوالی و فاصلههای مساوی بین آنها استفاده میشود. این تابع تعداد عناصر آرایه را به عنوان ورودی میگیرد.
# ایجاد یک آرایه با ۵ عدد بین ۰ و ۱
arr_linspace = np.linspace(0, 1, 5)
print(arr_linspace)
خروجی:
[0. 0.25 0.5 0.75 1. ]
۵. ایجاد آرایههای تصادفی
NumPy همچنین امکان ایجاد آرایههای تصادفی را فراهم میکند. برای این کار میتوانید از توابع موجود در زیرماژول np.random
استفاده کنید.
# ایجاد یک آرایه تصادفی با اعداد بین ۰ و ۱
random_arr = np.random.random((3, 3))
print(random_arr)
# ایجاد یک آرایه تصادفی با اعداد صحیح بین ۱ و ۱۰
random_int_arr = np.random.randint(1, 10, (3, 3))
print(random_int_arr)
خروجی (ممکن است متفاوت باشد):
[[0.123 0.456 0.789]
[0.234 0.567 0.890]
[0.345 0.678 0.901]]
[[3 7 2]
[5 8 4]
[6 1 9]]
در بخش بعدی، به بررسی روشهای تغییر شکل آرایهها در NumPy خواهیم پرداخت.
دستکاری شکل آرایهها در NumPy
یکی از قابلیتهای قدرتمند NumPy، امکان تغییر شکل آرایهها بدون تغییر در دادههای آنها است. این ویژگی به شما اجازه میدهد تا آرایهها را به شکلهای مختلفی درآورید و آنها را برای عملیات خاصی آماده کنید. در این بخش، به بررسی روشهای مختلف تغییر شکل آرایهها میپردازیم.
۱. تغییر شکل آرایهها با reshape()
تابع reshape()
به شما امکان میدهد تا شکل یک آرایه را بدون تغییر در دادههای آن تغییر دهید. تنها شرط این است که تعداد عناصر آرایه قبل و بعد از تغییر شکل یکسان باشد.
import numpy as np
# ایجاد یک آرایه یکبعدی
arr = np.arange(12)
print("آرایه اصلی:")
print(arr)
# تغییر شکل به یک آرایه دوبعدی ۳x۴
arr_reshaped = arr.reshape(3, 4)
print("آرایه تغییر شکل داده شده:")
print(arr_reshaped)
خروجی:
آرایه اصلی:
[ 0 1 2 3 4 5 6 7 8 9 10 11]
آرایه تغییر شکل داده شده:
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
۲. تغییر اندازه آرایهها با resize()
تابع resize()
شبیه به reshape()
است، اما اگر تعداد عناصر آرایه جدید بیشتر از آرایه اصلی باشد، عناصر اضافی با مقادیر تکراری پر میشوند. اگر تعداد عناصر کمتر باشد، بخشی از دادهها حذف میشوند.
# تغییر اندازه آرایه به ۴x۴
arr_resized = np.resize(arr, (4, 4))
print("آرایه تغییر اندازه داده شده:")
print(arr_resized)
خروجی:
آرایه تغییر اندازه داده شده:
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]
[ 0 1 2 3]]
۳. تبدیل آرایه به یکبعدی با flatten()
و ravel()
هر دو تابع flatten()
و ravel()
آرایههای چندبعدی را به آرایههای یکبعدی تبدیل میکنند. تفاوت اصلی بین این دو تابع این است که flatten()
یک کپی از آرایه اصلی برمیگرداند، در حالی که ravel()
یک نمای (view) از آرایه اصلی برمیگرداند.
# تبدیل آرایه دوبعدی به یکبعدی با flatten
arr_flattened = arr_reshaped.flatten()
print("آرایه تبدیل شده با flatten:")
print(arr_flattened)
# تبدیل آرایه دوبعدی به یکبعدی با ravel
arr_raveled = arr_reshaped.ravel()
print("آرایه تبدیل شده با ravel:")
print(arr_raveled)
خروجی:
آرایه تبدیل شده با flatten:
[ 0 1 2 3 4 5 6 7 8 9 10 11]
آرایه تبدیل شده با ravel:
[ 0 1 2 3 4 5 6 7 8 9 10 11]
۴. جابهجایی ابعاد با transpose()
و swapaxes()
تابع transpose()
ابعاد آرایه را جابهجا میکند. برای آرایههای دوبعدی، این تابع معادل تبدیل ماتریس است.
# جابهجایی ابعاد آرایه دوبعدی
arr_transposed = arr_reshaped.transpose()
print("آرایه جابهجا شده:")
print(arr_transposed)
خروجی:
آرایه جابهجا شده:
[[ 0 4 8]
[ 1 5 9]
[ 2 6 10]
[ 3 7 11]]
تابع swapaxes()
نیز برای جابهجایی دو محور خاص در آرایه استفاده میشود.
# جابهجایی محور ۰ و ۱ در آرایه دوبعدی
arr_swapped = arr_reshaped.swapaxes(0, 1)
print("آرایه با محورهای جابهجا شده:")
print(arr_swapped)
خروجی:
آرایه با محورهای جابهجا شده:
[[ 0 4 8]
[ 1 5 9]
[ 2 6 10]
[ 3 7 11]]
۵. افزایش ابعاد با np.expand_dims()
و np.newaxis
گاهی اوقات نیاز دارید ابعاد آرایه را افزایش دهید. برای این کار میتوانید از np.expand_dims()
یا np.newaxis
استفاده کنید.
# افزایش ابعاد آرایه یکبعدی به دوبعدی
arr_expanded = np.expand_dims(arr, axis=0)
print("آرایه با ابعاد افزایش یافته:")
print(arr_expanded)
# استفاده از np.newaxis
arr_newaxis = arr[np.newaxis, :]
print("آرایه با np.newaxis:")
print(arr_newaxis)
خروجی:
آرایه با ابعاد افزایش یافته:
[[ 0 1 2 3 4 5 6 7 8 9 10 11]]
آرایه با np.newaxis:
[[ 0 1 2 3 4 5 6 7 8 9 10 11]]
۶. حذف ابعاد با np.squeeze()
تابع np.squeeze()
ابعادی که اندازه آنها ۱ است را از آرایه حذف میکند.
# حذف ابعاد با اندازه ۱
arr_squeezed = np.squeeze(arr_expanded)
print("آرایه پس از حذف ابعاد:")
print(arr_squeezed)
خروجی:
آرایه پس از حذف ابعاد:
[ 0 1 2 3 4 5 6 7 8 9 10 11]
در بخش بعدی، به بررسی روشهای ادغام و تقسیم آرایهها در NumPy خواهیم پرداخت.
ادغام و تقسیم آرایهها در NumPy
در بسیاری از موارد، ممکن است نیاز داشته باشید چند آرایه را به هم متصل کنید یا یک آرایه را به چند بخش تقسیم کنید. NumPy ابزارهای قدرتمندی برای انجام این عملیات ارائه میدهد. در این بخش، به بررسی روشهای مختلف ادغام و تقسیم آرایهها میپردازیم.
۱. ادغام آرایهها
ادغام آرایهها به معنای ترکیب دو یا چند آرایه در یک آرایه جدید است. NumPy توابع مختلفی برای ادغام آرایهها در جهتهای مختلف ارائه میدهد.
الف. ادغام افقی و عمودی با np.concatenate()
تابع np.concatenate()
برای ادغام آرایهها در امتداد یک محور خاص استفاده میشود.
import numpy as np
# ایجاد دو آرایه یکبعدی
arr1 = np.array([1, 2, 3])
arr2 = np.array([4, 5, 6])
# ادغام افقی (در امتداد محور ۰)
arr_concat = np.concatenate((arr1, arr2))
print("ادغام افقی:")
print(arr_concat)
# ایجاد دو آرایه دوبعدی
arr2d_1 = np.array([[1, 2], [3, 4]])
arr2d_2 = np.array([[5, 6], [7, 8]])
# ادغام عمودی (در امتداد محور ۱)
arr_concat_vertical = np.concatenate((arr2d_1, arr2d_2), axis=1)
print("ادغام عمودی:")
print(arr_concat_vertical)
خروجی:
ادغام افقی:
[1 2 3 4 5 6]
ادغام عمودی:
[[1 2 5 6]
[3 4 7 8]]
ب. ادغام عمودی با np.vstack()
تابع np.vstack()
برای ادغام آرایهها در جهت عمودی (روی هم) استفاده میشود.
# ادغام عمودی دو آرایه دوبعدی
arr_vstack = np.vstack((arr2d_1, arr2d_2))
print("ادغام عمودی با vstack:")
print(arr_vstack)
خروجی:
ادغام عمودی با vstack:
[[1 2]
[3 4]
[5 6]
[7 8]]
ج. ادغام افقی با np.hstack()
تابع np.hstack()
برای ادغام آرایهها در جهت افقی (کنار هم) استفاده میشود.
# ادغام افقی دو آرایه دوبعدی
arr_hstack = np.hstack((arr2d_1, arr2d_2))
print("ادغام افقی با hstack:")
print(arr_hstack)
خروجی:
ادغام افقی با hstack:
[[1 2 5 6]
[3 4 7 8]]
د. ادغام در عمق با np.dstack()
تابع np.dstack()
برای ادغام آرایهها در جهت عمق (در امتداد محور سوم) استفاده میشود.
# ادغام در عمق دو آرایه دوبعدی
arr_dstack = np.dstack((arr2d_1, arr2d_2))
print("ادغام در عمق با dstack:")
print(arr_dstack)
خروجی:
ادغام در عمق با dstack:
[[[1 5]
[2 6]]
[[3 7]
[4 8]]]
۲. تقسیم آرایهها
تقسیم آرایهها به معنای شکستن یک آرایه به چند بخش کوچکتر است. NumPy توابع مختلفی برای تقسیم آرایهها ارائه میدهد.
الف. تقسیم آرایهها با np.split()
تابع np.split()
یک آرایه را به چند بخش مساوی تقسیم میکند.
# ایجاد یک آرایه یکبعدی
arr = np.arange(10)
# تقسیم آرایه به ۲ بخش مساوی
arr_split = np.split(arr, 2)
print("تقسیم آرایه به ۲ بخش:")
print(arr_split)
خروجی:
تقسیم آرایه به ۲ بخش:
[array([0, 1, 2, 3, 4]), array([5, 6, 7, 8, 9])]
ب. تقسیم عمودی با np.vsplit()
تابع np.vsplit()
یک آرایه دوبعدی را به چند بخش عمودی تقسیم میکند.
# ایجاد یک آرایه دوبعدی
arr2d = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
# تقسیم عمودی به ۳ بخش
arr_vsplit = np.vsplit(arr2d, 3)
print("تقسیم عمودی:")
print(arr_vsplit)
خروجی:
تقسیم عمودی:
[array([[1, 2, 3]]), array([[4, 5, 6]]), array([[7, 8, 9]])]
ج. تقسیم افقی با np.hsplit()
تابع np.hsplit()
یک آرایه دوبعدی را به چند بخش افقی تقسیم میکند.
# تقسیم افقی به ۳ بخش
arr_hsplit = np.hsplit(arr2d, 3)
print("تقسیم افقی:")
print(arr_hsplit)
خروجی:
تقسیم افقی:
[array([[1],
[4],
[7]]), array([[2],
[5],
[8]]), array([[3],
[6],
[9]])]
۳. تکرار آرایهها با np.repeat()
و np.tile()
گاهی اوقات نیاز دارید عناصر یک آرایه را تکرار کنید یا کل آرایه را چندین بار تکرار کنید. NumPy توابع np.repeat()
و np.tile()
را برای این منظور ارائه میدهد.
الف. تکرار عناصر با np.repeat()
تابع np.repeat()
هر عنصر آرایه را به تعداد مشخصی تکرار میکند.
# تکرار هر عنصر آرایه ۲ بار
arr_repeat = np.repeat(arr, 2)
print("تکرار عناصر:")
print(arr_repeat)
خروجی:
تکرار عناصر:
[0 0 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9]
ب. تکرار کل آرایه با np.tile()
تابع np.tile()
کل آرایه را به تعداد مشخصی تکرار میکند.
# تکرار کل آرایه ۲ بار
arr_tile = np.tile(arr, 2)
print("تکرار کل آرایه:")
print(arr_tile)
خروجی:
تکرار کل آرایه:
[0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9]
در بخش بعدی، به بررسی عملیات ریاضی و منطقی روی آرایهها در NumPy خواهیم پرداخت.
جمعبندی
در این مقاله، به بررسی روشهای مختلف دستکاری آرایهها در NumPy پرداختیم. از ایجاد و مقداردهی اولیه آرایهها تا تغییر شکل، ادغام، تقسیم و انجام عملیات ریاضی و منطقی، NumPy ابزارهای قدرتمندی را در اختیار شما قرار میدهد تا بتوانید بهطور مؤثر با دادههای عددی کار کنید.
- ایجاد و مقداردهی اولیه آرایهها: با استفاده از توابعی مانند
np.array()
,np.zeros()
,np.ones()
,np.arange()
وnp.linspace()
میتوانید آرایههای مختلفی ایجاد کنید. - تغییر شکل آرایهها: توابعی مانند
reshape()
,resize()
,flatten()
,ravel()
,transpose()
وswapaxes()
به شما امکان میدهند شکل آرایهها را بهراحتی تغییر دهید. - ادغام و تقسیم آرایهها: با استفاده از توابعی مانند
np.concatenate()
,np.vstack()
,np.hstack()
,np.split()
,np.vsplit()
وnp.hsplit()
میتوانید آرایهها را به هم متصل یا به بخشهای کوچکتر تقسیم کنید. - عملیات ریاضی و منطقی: NumPy توابعی مانند
np.sum()
,np.mean()
,np.min()
,np.max()
,np.std()
وnp.logical_and()
را برای انجام عملیات ریاضی و منطقی روی آرایهها ارائه میدهد.
این ابزارها به شما کمک میکنند تا دادههای خود را بهطور مؤثر پردازش و تحلیل کنید. NumPy نه تنها برای کارهای ساده، بلکه برای انجام محاسبات پیچیده و بزرگمقیاس نیز بسیار مناسب است.
با تسلط بر این روشها، میتوانید از NumPy بهعنوان یک ابزار قدرتمند در پروژههای علمی، دادهکاوی و یادگیری ماشین استفاده کنید. برای یادگیری بیشتر، میتوانید به مستندات رسمی NumPy مراجعه کنید یا در پروژههای عملی از این ابزارها استفاده کنید.
دیدگاهها