در این پست به معرفی و آموزش کتابخانه Numpy در پایتون خواهیم پرداخت ، بی شک Numpy یکی از مهم ترین و پرکاربردترین کتابخانه های پایتون می باشد.
با استفاده از کتابخانه Numpy امکان استفاده از آرایهها و ماتریسهای بزرگ چند بعدی فراهم میشود.
[lwptoc hierarchical=”1″ numeration=”roman”]
مقدمه : آشنایی با کتابخانه Numpy
کتابخانه numpy کتابخانه اصلی محاسبات ریاضی در زبان پایتون است.
این کتابخانه امکاناتی را برای تعریف و مدیریت آرایهها را برای پروژه های محاسباتی فراهم می کند.
NumPy که مخفف Numerical Python است، برای محاسبات عددی متنوعی در پایتون به کار میرود.
محاسبات به کمک آرایهها در Numpy سرعت خوبی دارند و علاوه بر آن، توابع این پکیج در ساخت پکیجهای محاسباتی دیگر مورد استفاده قرار گرفته است.
آرایه ها را می توان معادل تقریبی ماتریس ها در ریاضی دانست.
برای دستیابی به یک خانه از آرایه مجموعه از چند عدد استفاده می شود این اعداد موقعیت خانه را در هر بعد آرایه تعیین می کند.
مثال برای یک آرایه دو بعدی دو عدد برای تعیین موقعیت خانه لازم است تا موقعیت داده مورد نظر را در سطر و ستون دلخواه مشخص کند.
برای مثال، مختصات یک نقطه در فضای 3 بعدی [1, 2, 1] یک آرایه با رتبه 1 است زیرا یک محور دارد.
این محور طولی بهاندازه 3 دارد.
در مثال زیر آرایه رتبه 2 دارد (2 بعدی است). بعد (محور) نخست طولی به اندازه 2 دارد، بعد دوم طول 3 دارد.
1 2 |
[[ 1., 0., 0.], [ 0., 1., 2.]] |
نصب Numpy در پایتون :
برای نصب نامپای در پایتون کافی است دستور زیر را استفاده کنید :
1 |
pip install numpy |
و بعد از نصب ، برای استفاده از آن کافی است که آن را در ابتدای برنامه خود ایمپورت کنید:
1 |
import numpy as np |
تعریف یک آرایه با Numpy
چند روش برای ایجاد آرایه وجود دارند. برای مثال، میتوان با استفاده از تابع array یک آرایه را از فهرست معمولی پایتون یا چندتاییها ایجاد کرد.
نوع آرایه حاصل، برابر با نوع عناصر موجود در دنبالههای تشکیل دهنده آن خواهد بود.
1 2 |
from numpy import * a = array( [2,3,4] ) |
کد فوق یک آرایه یک بعدی ایجاد میکند و مقادیر [2,3,4] را در آن قرار میدهد.
اندیس گذاری آرایه در پایتون :
هر آرایه ، خانه هایی دارد که به آنها درایه میگوییم و عناصر آرایه داخل درایه های آن قرار میگیرد ، برای دسترسی به مقادیر داخل آرایه از اندیس استفاده میکنیم.
اندیس آرایه در پایتون از 0 شروع میشود ، بعنوان مثال ، آرایه فوق 3 عضو دارد و اندیس آنها از 0 تا 2 است .
برای دسترسی به عناصر آرایه باید اندیس آن را بکار برد، بعنوان مثال میخواهیم مقدار دومین خانه در آرایه فوق را مساوی 5 قرار بدهیم:
1 2 3 4 5 6 |
>>> a=np.array([1,2,3]) array([1, 2, 3]) >>> a[2]=5 >>> a array([1, 2, 5]) |
ایجاد آرایه با مقادیر پیش فرض اولیه
گاهی لازم است یک ماتریس با مقادیر یکسان و پیش فرض در همه خانه ها ایجاد کنیم برای این منظور می توان از توابع ،zeros،ones،full و .. استفاده کرد. به مثال زیر توجه کنید:
ساخت آرایه با مقدار اولیه صفر در پایتون
1 2 |
import numpy as np a=np.zeros((2,2)) |
کد فوق یک آرایه 2 در 2 با مقدار اولیه 0 می سازد.
ساخت آرایه با مقدار اولیه یک در پایتون
1 2 |
import numpy as np a=np.ones((2,2)) |
کد فوق یک آرایه 2 در 2 با مقدار اولیه 1 می سازد.
ساخت آرایه با مقدار تصادفی در پایتون
1 2 |
import numpy as np a=np.random.random((2,2)) |
کد فوق یک آرایه 2 در 2 با مقدار تصادفی در پایتون می سازد.
ساخت آرایه با تقسیم یک بازه خاص
NumPy برای ایجاد دنبالههایی از اعداد یک تابع مشابه range ارائه کرده است که بهجای لیست، یک آرایه برمیگرداند.
1 2 3 4 |
>>> arange( 10, 30, 5 ) array([10, 15, 20, 25]) >>> arange( 0, 2, 0.3 ) # آرگومانهای اعشاری میپذیرد array([ 0. , 0.3, 0.6, 0.9, 1.2, 1.5, 1.8] |
تابع arrange یک بازه را میگیرد و آن را به بخش های مساوی تقسیم میکند. مثلا کد زیر بازه 0 تا 10 را به 10 قسمت تقسیم میکند:
1 2 3 |
>>> a = np.arange(10) >>> a array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) |
پارامترهای این تابع عبارتند از : مقدار شروع ، مقدار پایانی بازه و طول گام ، اگر مقدار شروع وارد نشود 0 در نظر گرفته میشود مثل مثال فوق.
زمانی که arange با آرگومانهای اعشاری استفاده میشود، به دلیل دقت متناهی اعداد اعشاری، عموماً امکان پیشبینی تعداد عناصر به دست آمده وجود ندارد.
به همین دلیل معمولاً استفاده از تابع linspace که تعداد عناصر مطلوب را نیز به عنوان یک آرگومان میگیرد، بهتر است:
1 2 3 4 |
>>> linspace( 0, 2, 9 ) # 9 عدد از 0 تا 2 array([ 0. , 0.25, 0.5 , 0.75, 1. , 1.25, 1.5 , 1.75, 2. ]) >>> x = linspace( 0, 2*pi, 100 ) # برای تابع ارزیابی در نقاط زیاد مناسب است >>> f = sin(x) |
آشنایی با ویژگی های آرایه های Numpy
کلاس آرایه Numpy بهصورت ndarray نامگذاری شده است. خصوصیات مهمتر یک ndarray بدین ترتیب هستند.
- ndarray.ndim
- تعداد محور (ابعاد) آرایه است. در دنیای پایتون تعداد ابعاد بهصورت رتبه نامیده میشود.
- ndarray.shape
- ابعاد یک آرایه است. این خصوصیت از یک چندتایی اعداد صحیح تشکیل یافته است که نشاندهنده اندازه هر بعد آرایه هستند. برای یک ماتریس با n ردیف و m ستون، شکل (shape) بهصورت (n,m) خواهد بود. بدین ترتیب طول چندتایی shape برابر با رتبه آرایه یا تعداد ابعاد ndim است.
- ndarray.size
- تعداد کل عناصر آرایه است. این مقدار برابر با حاصلضرب اجزای shape است.
- ndarray.dtype
- نوع عناصر یک آرایه را توصیف میکند. فرد میتواند dtype آرایه را با استفاده از انواع استاندارد پایتون ایجاد یا توصیف کند. بهعلاوه NumPy انواع مخصوص به خود را نیز دارد. برای مثال numpy.int32، numpy.int16 و numpy.float64 نمونههایی از انواع آرایه تعریف شده در NumPy هستند.
- ndarray.itemsize
- اندازه بایتهای هر یک از عناصر آرایه است. برای نمونه itemsize یک آرایه از عناصری با نوع float64 برابر با 8 (64/8) است در حالی که itemsize یک آرایه از نوع complex32 برابر با 4 (32/8) است. این مقدار معادل ndarray.dtype.itemsize است.
- ndarray.data
- این بافر (buffer) حاوی عناصر واقعی آرایه است. بهطورمعمول ما نیاز نداریم از این خصوصیت استفاده کنیم، زیرا با استفاده از امکان اندیسگذاری میتوانیم به عناصر آرایه دسترسی داشته باشیم.
در مثال زیر میتوانیم نحوه کار با ویژگی های فوق را مشاهده کنیم:
1 2 3 4 5 6 7 8 9 |
>>> from numpy import * >>> a = array( [2,3,4] ) >>> a array([2, 3, 4]) >>> a.dtype dtype('int32') >>> b = array([1.2, 3.5, 5.1]) >>> b.dtype dtype('float64') |
پرینت کردن آرایهها
زمانی که یک آرایه را چاپ میکنید NumPy آن را به صوت یک فهرست تودرتو نمایش میدهد که طرح کلی آن بهصورت زیر است:
آخرین محور از چپ به راست پرینت میشود.
محور ماقبل آخر از بالا به پایین پرینت میشود.
باقی محورها نیز از بالا به پایین پرینت و هرکدام با یک خط خالی از قبلی جدا میشوند.
بدین ترتیب آرایههای تکبعدی بهصورت ردیفی، آرایههای دوبعدی بهصورت ماتریس و آرایههای سهبعدی بهصورت فهرستی از ماتریسها پرینت میشوند.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
>>> a = arange(6) # 1d آرایه >>> print a [0 1 2 3 4 5] >>> >>> b = arange(12).reshape(4,3) # 2d آرایه >>> print b [[ 0 1 2] [ 3 4 5] [ 6 7 8] [ 9 10 11]] >>> >>> c = arange(24).reshape(2,3,4) # 3d آرایه >>> print c [[[ 0 1 2 3] [ 4 5 6 7] [ 8 9 10 11]] [[12 13 14 15] [16 17 18 19] [20 21 22 23]]] |
اگر یک آرایه برای پرینت گرفتن بسیار بزرگ باشد، NumPy به طور خودکار بخش مرکزی آرایه را قطع میکند و تنها ابتدا و انتهای آن را نمایش میدهد.
1 2 3 4 5 6 7 8 9 10 11 |
>>> print arange(10000) [ 0 1 2 ..., 9997 9998 9999] >>> >>> print arange(10000).reshape(100,100) [[ 0 1 2 ..., 97 98 99] [ 100 101 102 ..., 197 198 199] [ 200 201 202 ..., 297 298 299] ..., [9700 9701 9702 ..., 9797 9798 9799] [9800 9801 9802 ..., 9897 9898 9899] [9900 9901 9902 ..., 9997 9998 9999] |
برای اینکه این حالت را غیرفعال کنیم و NumPy کل آرایه را پرینت بگیرد، میتوانیم با استفاده از گزینه set_printoptions رفتار آن را تغییر دهیم.
1 |
>>> set_printoptions(threshold='nan') |