NumPy کار با آرایه ها را آسان می کند.
اگر با پایتون کار می کنید، دانستن برخی از اصول اولیه NumPy نیز برایتان مفید است. این کتابخانه برای کار با آرایه ها بسیار مفید است، به دلیل سرعت و کارآمدی بالای آن. همچنین شامل روش های زیادی برای ساده کردن دستکاری و انجام عملیات عددی روی آرایه ها است.
ساختارهای داده زیادی در پایتون وجود دارد، از جمله لیست ها، دیکشنری ها، Pandas DataFrames و البته آرایه های NumPy. هر کدام نقاط قوت خود را دارند و اینکه بدانید چه زمانی از کدام یک از آن ها استفاده کنید، باعث صرفه جویی در زمان و تلاش شما هنگام برنامه نویسی می شود.
در این مقاله، ما اصول اولیه NumPy را به شما نشان می دهیم و توضیح می دهیم که چرا اینقدر مفید است. چند مثال نیز می آوریم تا به موضوع مسلط شوید و پایهای برای کارآمدتر کردن پروژههای تجزیه و تحلیل دادهها به شما ارائه دهیم.
چرا NumPy؟
آرایه ها در NumPy شباهت های زیادی با سایر ساختارهای داده مانند لیست ها دارند. آنها می توانند داده های عددی و همچنین رشته ها را ذخیره کنند، قابل تغییر هستند و می توان آنها را به روش های مشابه با لیست ها برش داد و لیست کرد. با این حال، یک لیست نمی تواند عملیات عددی را به آسانی یک آرایه در numpy انجام دهد.
مثلاً برای ضرب همه عناصر یک آرایه در 2 در numpy، به سادگی از array*2
استفاده می کنیم. این کار به عنوان عملیات برداری شناخته می شود. برای انجام همین کار با یک لیست نیاز به یک حلقه for یا list comprehension است که هر دو به کد بیشتری نیاز دارند. علاوه بر این، آرایه ها بسیار سریعتر از لیست ها هستند و حافظه بسیار کمتری مصرف می کنند زیرا متد های NumPy برای کار با آرایه ها بسیار بهینه شده اند.
Pandas جایگزین خوب دیگری است که عملکردی را برای تجزیه و تحلیل و تجسم داده ها فراهم می کند. ساختار داده اصلی در پانداس Series
است، که شبیه به یک آرایه NumPy یک بعدی است. با این حال، بازهم، NumPy در انجام محاسبات عددی سریعتر و کارآمدتر است.
ایجاد آرایه ها
آرایه های NumPy در هنگام ایجاد اندازه ثابتی دارند و عناصر باید از یک نوع داده باشند. این دو، دو محدودیت اصلی هستند که باید هنگام ایجاد آرایه ها در نظر داشته باشید. تابع array()
حاوی آرگومان های زیر است:
numpy.array(object, dtype=None, *, copy=True, order='K', subok=False, ndmin=0, like=None)
برای اختصار، جزئیات همه آرگومان ها را ارائه نمی دهیم. اگر به جزئیات علاقه دارید به مستندات نگاهی بیندازید. برای اکثر برنامه ها، فقط باید آرگومان های object و احتمالاً dtype
را تعریف کنید.
برای تعریف یک آرایه 1 بعدی و چاپ آن، موارد زیر را انجام دهید:
import numpy as np
ar = np.array([1, 2, 3, 4])
print(ar.shape)
(4,)
برای یک آرایه چند بعدی NumPy، آرگومان object
شکل یک دنباله تودرتو به خود می گیرد، که در آن مجموعه های جداگانه ردیف های آرایه را تعریف می کنند. مثلاً:
ar = np.array([[1, 2, 3, 4], [5, 6, 7, 8]])
print(ar.shape)
(2, 4)
یک آرایه NumPy همچنین میتواند انواع دادههای مختلفی مانند اعداد صحیح، اعشاری، رشتهها و دودویی را در خود نگه دارد. حتی می تواند اعداد مختلط را نیز ذخیره کند. می توانیم عناصر موجود در آرایه بالا را مستقیماً به صورت زیر به رشته تبدیل کنیم:
ar_string = ar.astype(str)
ar_string
array([['1', '2', '3', '4'],
['5', '6', '7', '8']], dtype='<u11')< code=""></u11')<>
یا می توانیم هنگام تعریف آرایه آرگومان dtype=str
را تنظیم کنیم.
آرایه ای از مقادیر بولی می تواند به صورت زیر ایجاد شود:
np.array([[1, 1, 0, 0], [0, 1, 0, 1]], dtype=bool)
array([[True, True, False, False],
[False, True, False, True]])
راههای مختلفی برای تعریف یک آرایه با مقادیر دلخواه بهعنوان یک آرایه اولیه برای پر کردن دادههای واقعی در آینده وجود دارد. توابع numpy.ones()
و numpy.zeros()
به ترتیب یک آرایه پر از یک و صفر ایجاد می کنند.
تابع numpy.empty()
یک آرایه را بدون مقداردهی اولیه ورودی ایجاد می کند. این تابع خاص از کاربر می خواهد که تمام مقادیر آرایه را به صورت دستی تنظیم کند و باید با احتیاط استفاده شود. با این حال، ممکن است کمی سریعتر از دو تابع قبل باشد.
برای استفاده از این توابع، اندازه آرایه باید مشخص شود:
np.zeros((3, 2))
array([[0., 0.],
[0., 0.],
[0., 0.]])
آرایه هایی با یک دنباله ثابت را می توان با دو تابع مفید NumPy تعریف کرد: arange
و linspace
. برای arange
، باید مقادیر start و stop و step را مشخص کنید. مثلا:
np.arange(2, 20, 4)
array([ 2, 6, 10, 14, 18])
این تابع شبیه به تابع داخلی range()
است که می تواند در حلقه ها استفاده شود. تابع linspace
در NumPy اعداد با فاصله مساوی را در بازه ای که با مقادیر شروع و توقف تعریف شده است برمی گرداند.
مثال زیر با استفاده از همان آرگومان هایی که در مثال قبل آمده است:
np.linspace(2, 20, 4)
array([ 2., 8., 14., 20.])
در اینجا، آرگومان سوم، تعداد مقادیری که باید برگردانده شوند را، به جای اندازه گام (مانند مثال قبلی)، تعریف می کند.
خواندن و نوشتن CSV
بیشتر اوقات، شما می خواهید داده های ذخیره شده در یک فایل را در یک آرایه NumPy بخوانید. NumPy با چند تابع برای کمک به بارگیری و ذخیره آرایه ها ارائه می شود. اینها بر روی مدیریت داده های باینری یا داده های ذخیره شده در فایل های متنی متمرکز هستند. این دو تابع load()
و save()
قابلیتی برای بارگیری و ذخیره آرایه ها در یک فایل باینری ارائه می کنند.
اگر با فایل های متنی، به ویژه CSV در پایتون کار می کنید، بهترین راه برای خواندن و نوشتن آرایه ها در فایل، استفاده از توابع LOADTXT() و SAVETXT() است. دومی دارای دو آرگومان الزامی است fname
و X
که به ترتیب نام فایل و آرایه را برای ذخیره تعریف می کند. برای ذخیره در CSV، باید delimiter
را نیز مشخص کنید که معرفی کننده کاراکتر جدا کننده است. برای نشان دادن عملکرد این توابع، بیایید یک آرایه 2×4 ایجاد کنیم، آن را در CSV ذخیره کنیم، سپس آن را دوباره در برنامه بخوانیم:
ar = np.array([[1, 2, 3, 4], [5, 6, 7, 8]])
np.savetxt('output_array.csv', ar, delimiter=',')
ar_read = np.loadtxt('output_array.csv', delimiter=',')
ar_read
array([[1., 2., 3., 4.],
[5., 6., 7., 8.]])
همچنین می توانید از پایتون خالص و تابع داخلی open()
استفاده کنید. در اینجا مقاله ای در مورد نوشتن در فایل در پایتون آمده است که به شما نشان می دهد چگونه از این تابع استفاده کنید.
برخی از متد های آرایه NumPy
اکنون که راههای ایجاد آرایه در پایتون را توضیح دادیم، بیایید نگاهی به کارهایی که میتوانید با آن انجام دهید بیاندازیم. NumPy متد های مفید و بهینه شده زیادی دارد که به شما امکان می دهد عملیات روی آرایه را انجام دهید و اطلاعات بیشتری در مورد آرایه خود دریافت کنید.
همانطور که در مقدمه اشاره کردیم، انجام عملیات پایه روی آرایه ها مانند array1 + array2
یا ضرب در یک عدد، ساده است. برای جبر خطی توابع کارآمدی وجود دارد، به عنوان مثال، برای محاسبه ضرب نقطه ای یا متقاطع یا برای محاسبه جابجایی یک آرایه.
یک نیاز رایج، خلاصه کردن محتویات یک آرایه است. NumPy شامل توابعی برای محاسبه آمار مانند میانگین، میانه، انحراف استاندارد و غیره است. به طور پیش فرض، آمار بر روی آرایه مسطح شده محاسبه می شود. مثلاً:
ar = np.array([[1, 2, 3, 4], [5, 6, 7, 8]])
np.mean(ar)
4.5
np.mean(ar, axis=0)
array([3., 4., 5., 6.])
np.mean(ar, axis=1)
array([2.5, 6.5])
با تعیین مقدار axis=0
میانگین را روی ستون ها محاسبه می کند و axis=1
میانگین را روی ردیف ها محاسبه می کند. اکنون که می دانیم چگونه یک آمار خلاصه تولید کنیم، می توانیم میانگین ردیف ها را پیدا کرده و این اطلاعات را به ستون جدیدی در آرایه اضافه کنیم:
row_mean = np.mean(ar, axis=1).reshape(2, 1)
new_ar = np.append(ar, row_mean, axis=1)
new_ar
array([[1., 2., 3., 4., 2.5],
[5., 6., 7., 8., 6.5]])
در اینجا، میانگین هر ردیف را محاسبه می کنیم، با متد reshape آن را تغییر شکل می دهیم و از یک آرایه دو عنصری به دو ردیف آرایه تک عنصری تبدیل می کنیم و سپس از تابع append برای اضافه کردن آن ها به عنوان ستون جدید آرایه قبلی برای هر ردیف استفاده می کنیم. توجه کنید که نوع داده کل آرایه تغییر کرده است و به اعداد اعشاری تبدیل شده اند زیرا میانگین ما اعشاری است.
نتیجه گیری
NumPy یک ابزار اساسی در تجزیه و تحلیل داده پایتون است. این کتابخانه با تعداد زیادی تابع و متد مفید و همچنین سرعت و کارایی در هسته آن بالغ شده است. اکنون که اصول اولیه NumPy را می دانید، می توانید از آنچه در اینجا یاد گرفته اید برای کارآمدتر کردن پروژه های خود استفاده کنید.
دیدگاهها