۲۷ عملیات NumPy برای افراد تازه کار — راهنمای مقدماتی
در این مقاله قصد داریم 27 عملیات NumPy برای افراد تازهکار را معرفی کنیم تا کسانی که اخیراً شروع به استفاده از این کتابخانه مفید پایتون کردهاند، بتوانند سریعتر با قابلیتهای آن آشنا شده و بیشترین بهره را از آن بگیرند. NumPy کتابخانهای قدرتمند است که میتواند برای انواع مختلف عملیات، از یافتن میانگین یک آرایه تا تبدیل سریع فوریه و تحلیل سیگنال مورد استفاده قرار گیرد. از این نظر NumPy شباهت زیادی به MATLAB دارد.
ابتدا میبایست NumPy را به صورت np ایمپورت کنید تا بتوانید عملیات مورد نظر را اجرا نمایید.
عملیات مختلف با NumPy
در ادامه به آن دسته از عملیات میپردازیم که میتوانند برای افراد مبتدی و یا تازهکار در حین بهرهگیری از NumPy بسیار مفید باشند.
1. تبدیل یک لیست به آرایه n-بعدی NumPy
numpy_array = np.array(list_to_convert)
2. استفاده از np.newaxis و np.reshape
np.newaxis برای ایجاد ابعاد جدید به اندازه 1 استفاده میشود. به مثال زیر توجه کنید:
a = [1,2,3,4,5] is a list a_numpy = np.array(a)
اگر a_numpy.shape را پرینت کنید، مقدار (5) به دست میآید. برای این که آن را به یک بردار ردیفی یا بردار ستونی تبدیل کنیم، میتوانیم از کد زیر استفاده کنیم:
row_vector = a_numpy[:,np.newaxis] ####shape is (5,1) now col_vector = a_numpy[np.newaxis,:] ####shape is (1,5) now
به طور مشابه np.reshape میتواند برای تغییر شکل هر آرایهای مورد استفاده قرار گیرد. به مثال زیر توجه کنید:
a = range(0,15) ####list of numbers from 0 to 14 b = a.reshape(3,5) b would become: [[0,1,2,3,4], [5,6,7,8,9], [10,11,12,13,14], [15,16,17,18,19]]
3. تبدیل هر نوع داده به آرایه NumPy
در مثال زیر شیوه استفاده از np.asarray را میبینید:
a = [(1,2), [3,4, (5)], (6,7,8)] b = np.asarray(a) b:: array([(1, 2), list([3, 4, (5, 6)]), (6, 7, 8)], dtype=object)
4. دریافت آرایه n-بعدی از صفرها
این کار با استفاده از کد زیر ممکن است:
a = np.zeros(shape,dtype=type_of_zeros) type of zeros can be int or float as it is required eg. a = np.zeros((3,4), dtype = np.float16)
5. دریافت آرایه n-بعدی از یکها
همانند np.zeros این بار به صورت زیر عمل میکنیم:
a = np.ones((3,4), dtype=np.int32)
6. np.full و np.empty
np.full برای دریافت یک آرایه استفاده میشود که با یک مقدار خاص پر شده است، در حالی که np.empty به ما کمک میکند که یک آرایه ایجاد کرده و مقادیر تصادفی در آن وارد کنیم. به مثال زیر توجه کنید:
1. np.full(shape_as_tuple,value_to_fill,dtype=type_you_want) a = np.full((2,3),1,dtype=np.float16) a would be: array([[1., 1., 1.], [1., 1., 1.]], dtype=float16) 2. np.empty(shape_as_tuple,dtype=int) a = np.empty((2,2),dtype=np.int16) a would be: array([[25824, 25701], [2606, 8224]], dtype=int16) The integers here are random.
7. ایجاد آرایهای از مقادیر با فاصله یکنواخت با np.arrange و np.linspace
هر دو متد فوق میتوانند برای ایجاد یک آرایه با عناصری که فاصلهای یکنواخت دارند مورد استفاده قرار گیرند. مثال np.linspace به صورت زیر است:
np.linspace(start,stop,num=50,endpoint=bool_value,retstep=bool_value) endpoint specifies if you want the stop value to be included and retstep tells if you would like to know the step-value.'num' is the number of integer to be returned where 50 is default Eg, np.linspace(1,2,num=5,endpoint=False,retstep=True) This means return 5 values starting at 1 and ending befor 2 and returning the step-size. output would be: (array([1., 1.2, 1.4, 1.6, 1.8]), 0.2) ##### Tuple of numpy array and step-size
مثال np.arrange به صورت زیر است:
np.arange(start=where_to_start,stop=where_to_stop,step=step_size)
اگر تنها یک عدد به عنوان آرگومان استفاده شده باشد، به عنوان نقطه توقف تصور میشود و در صورتی که 2 عدد ارائه شده باشد، نقاط آغاز و توقف در نظر گرفته میشود. به شیوه نگارش آنها توجه داشته باشید.
8. یافتن شکل یک آرایه NumPy
array.shape
9. دانستن ابعاد آرایه NumPy
x = np.array([1,2,3]) x.ndim will produce 1
10. یافتن تعداد عناصر در آرایه NumPy
x = np.ones((3,2,4),dtype=np.int16) x.size will produce 24
11. دریافت فضای حافظه اشغال شده از سوی یک آرایه n-بعدی
x.nbytes output will be 24*memory occupied by 16 bit integer = 24*2 = 48
12. یافتن نوع داده عناصر در آرایه NumPy
x = np.ones((2,3), dtype=np.int16) x.dtype will produce dtype('int16') It works better when elements in the array are of one type otherwise typecasting happens and result may be difficult to interpret.
13. شیوه ایجاد یک کپی از آرایه NumPy
در مثال زیر شیوه استفاده از متد np.copy را میبینید:
y = np.array([[1,3], [5,6]]) x = np.copy(y) If, x[0][0] = 1000 Then, x is 100 3 5 6 y is 1 3 5 6
14. دریافت ترانهاده آرایه n-بعدی
به این منظور از متد array_name.T استفاده میکنیم:
x = [[1,2], [3,4]] x 1 2 3 4 x.T is 1 3 2 4
15. مسطح سازی یک آرایه n-بعدی و به دست آوردن یک آرایه تک بعدی
به این منظور از متدهای np.reshape و np.ravel استفاده میکنیم.
np.reshape
این یک ترفند بسیار مفید و زیبا است. در زمان تغییر شکل دادن آرایه اگر مقدار 1- به عنوان یکی از ابعاد ارائه شود، تعداد عناصر از آن استنباط میشود. برای نمونه در مورد یک آرایه با اندازه (1,3,4) اگر به صورت (1,2,2-) تغییر شکل یابد، طول بُعد اول به صورت 3 محاسبه میشود. به مثال زیر توجه کنید.
If x is: 1 2 3 4 5 9 Then x.reshape(-1) produces: array([1, 2, 3, 4, 5, 9])
np.ravel
شیوه استفاده از این متد نیز به صورت زیر است:
x = np.array([[1, 2, 3], [4, 5, 6]]) x.ravel() produces array([1, 2, 3, 4, 5, 6])
16. تغییر محورهای آرایه n-بعدی یا تعویض ابعاد
در مثال زیر از متدهای np.moveaxis و np.swapaxes استفاده شده است:
x = np.ones((3,4,5)) np.moveaxis(x,axes_to_move_as_list, destination_axes_as_list) For eg. x.moveaxis([1,2], [0,-2]) This means you want to move 1st axis to 0th axes and 2nd axes to 2nd last axis. So,the new shape would be. (4,5,3)
تا زمانی که تبدیل را ذخیره نکنید، صوت نگرفته است، از این رو باید حتماً آن را در متغیر دیگری ذخیره سازید.
np.swapaxes
x = np.array([[1,2], [3,4]]) x.shape is (2,2) and x is 1 2 3 4 np.swapaxes(x,0,1) will produce 1 3 2 4 If x = np.ones((3,4,5)), and y = np.swapaxes(0,2) y.shape will be (5,4,3)
17. تبدیل آرایه NumPy به لیست
روش انجام کار را در مثال زیر میبینید:
x = np.array([[3,4,5,9], [2,6,8,0]]) y = x.tolist() y will be [[3, 4, 5, 9], [2, 6, 8, 0]]
مستندات NumPy اشاره میکنند که استفاده از list(x) در صورتی که x تکبُعدی باشد نیز کار میکند.
18. تغییر نوع داده عناصر در یک آرایه NumPy
به این منظور از ndarray.astype استفاده میکنیم:
x = np.array([0,1,2.0,3.0,4.2],dtype=np.float32) x.astype(np.int16) will produce array([0, 1, 2, 3, 4], dtype=int16) x.astype(np.bool) will produce array([False, True, True, True, True])
19. دریافت اندیسهای عناصر غیر صفر
به این منظور از ()n-dim_array.nonzero استفاده میکنیم.
x = np.array([0,1,2.0,3.0,4.2],dtype=np.float32) x.nonzero() will produce (array([1, 2, 3, 4]),) It's important to note that x has shape (5,) so only 1st indices are returned. If x were say, x = np.array([[0,1], [3,5]]) x.nonzero() would produce (array([0, 1, 1]), array([1, 0, 1])) So, the indices are actually (0,1), (1,0), (1,1).
20. مرتب ساز آرایه NumPy
به این منظور از np.ndarray.sort(axis=axis_you_want_to_sort_by) استفاده میکنیم:
x = np.array([[4,3], [3,2]) x is 4 3 3 2 x.sort(axis=1) #sort each row 3 4 2 3 x.sort(axis=0) #sort each col 3 2 4 3
21. مقایسه آرایههای NumPy با مقادیر
مقایسه کردن آرایههای n-بعدی از نوع بولی تولید میکند. به مثال زیر توجه کنید:
x = np.array([[0,1], [2,3]]) x==1 will produce array([[False, True], [False, False]])
اگر میخواستید تعداد یکها را در x بشمارید، میتوانستید به صورت زیر عمل کنید:
(x==1).astype(np.int16).sum()
خروجی آن 1 خواهد بود.
22. ضرب دو ماتریس NumPy
از numpy.matmul برای به دست آوردن ماتریس حاصلضرب ماتریسهای 2 بعدی استفاده میکنیم:
a = np.eye(2) #identity matrix of size 2 a 1 0 0 1 b = np.array([[1,2], [3,4]]) b 1 2 3 4 np.matmul(a,b) will give 1 2 3 4
اگر یک آرایه 1 بُعدی ارائه کنیم، خروجی میتواند بسیار متفاوت از زمانی باشد که از broadcasting استفاده میکنیم. این موضوع را در ادامه بیشتر بررسی میکنیم. ضمناً تابع دیگری به نام np.multiply وجود دارد که ضرب عنصر به عنصر را اجرا میکند. در مورد دو ماتریس قبلی خروجی np.multiply(a,b) به صورت زیر خواهد بود:
1 0 0 4
23. حاصلضرب داخلی دو آرایه
برای به دست آوردن حاصلضرب داخلی یا نقطهای دو آرایه از np.dot(matrix1, matrix2) استفاده میکنیم:
a = np.array([[1,2,3], [4,8,16]]) a: 1 2 3 4 8 16 b = np.array([5,6,11]).reshape(-1,1) b: 5 6 11 np.dot(a,b) produces 38 160 Just like any dot product of a matrix with a column vector would produce.
حاصلضرب داخلی یک بردار ردیفی با یک بردار ستونی، نتیجهای به صورت زیر به دست میدهد:
if a is array([[1, 2, 3, 4]]) and b is: array([[4], [5], [6], [7]]) np.dot(a,b) gives: array([[60]]) a's shape was (1,4) and b's shape was (4,1) so the result will have shape (1,1)
24. به دست آوردن حاصلضرب خارجی دو بردار NumPy
ما قبلاً در فیزیک با مفهوم ضرب خارجی دو بردار آشنا شدهایم. این حاصلضرب برابر با جهت گشتاور حول یک نقطه است.
x = [1,2,3] y = [4,5,6] z = np.cross(x, y) z is: array([-3, 6, -3])
25. به دست آوردن گرادیان یک آرایه
برای به دست آوردن گرادیان یک آرایه از np.gradient استفاده میکنیم. NumPy گرادیان را با استفاده از سری تیلور و متد تفاضل مرکزی به دست میآورد.
x = np.array([5, 10, 14, 17, 19, 26], dtype=np.float16) np.gradient(x) will be: array([5., 4.5, 3.5, 2.5, 4.5, 7.], dtype=float16)
26. تقطیع آرایه NumPy
تقطیع یک آرایه در NumPy به صورت زیر انجام میشود:
For single element: x[r][c] where r,c are row and col number of the element. For slicing more than one element. x: 2 4 9 3 1 5 7 8 0 and you want 2,4 and 7,8 then do x[list_of_rows,list_of_cols] which would be x[[0,0,2,2], [0,1,0,1]] produces array([2, 4, 7, 8]) If one of the rows or cols are continuous, it's easier to do it: x[[0,2],0:2] produces array([[2, 4], [7, 8]])
27. Broadcasting
هر مقالهای در مورد NumPy که به بررسی Broadcasting نپرداخته باشد، کامل محسوب نمیشود. Broadcasting جنبه مهمی از NumPy است که به بردارسازی عملیات کمک میکند و از این رو محاسبات سریعتر میشوند. درک برخی قواعد به تفهیم بهتر Broadcasting کمک خواهد کرد.
در مستندات NumPy چنین آمده است:
زمانی که عملیاتی روی دو آرایه اجرا میشود، NumPy شکل آنها را بر مبنای عناصر مقایسه میکند. بدین ترتیب از ابعاد آخر آغاز میکند و به سمت آغاز حرکت میکند. دو بُعد زمانی تطبیقپذیر هستند که برابر باشند، یا یکی از آنها 1 باشد.
نکته دیگری که باید در خاطر داشته باشید این است که اگر عدم تطبیق ابعاد وجود داشته باشد، خروجی طول بعد بزرگتر را خواهد داشت. اگر یک بُعد طول 1 داشته باشد، مقدار آن بُعد تکرار خواهد شد.
فرض کنید دو آرایه A و B به ترتیب با ابعاد (3,4,5) و (4,1) وجود دارند و میخواهید دو آرایه را با هم جمع کنید. از آنجا که شکل یکسانی ندارند، NumPy تلاش میکند تا مقادیر را broadcast کند. بنابراین کار را از مقایسه طول عدد آخر با دو بُعد دیگر که 5 و 1 هستند، آغاز میکند. این مقادیر برابر نیستند، اما از آنجا که یکی از آنها 1 است، تکرار میشود و خروجی نهایی دارای طول 5 در بُعد آخر خواهد بود. بُعد ماقبل آخر در هر دو ماتریس، طولی برابر با 4 دارند.
بُعد سوم یا بُعد اول در A طول 3 دارد در حالی که B هیچ چیز ندارد. زمانی که یک بُعد یک بردار کم داشته باشد، NumPy 1 را به بردار الحاق میکند. بنابراین B به صورت (1,4,1) درمیآید. اینک طولها با هم برابرند، زیرا 3 و 1 هستند و مقادیر در B سه بار تکرار شدهاند. خروجی نهایی به شکل (3,4,5) خواهد بود:
a: 3 5 8 4 5 6 9 7 2 b: b = [2,3,4] a's shape: (3,3) b's shape: (3,) Last dimension has same length 3 for the two and then 1 is prepended to the the dimension of b as it doesn't have anything in that dimension. So, b becomes [[2,3,4]] having shape (1,3). Now, 1st dimension match and values are repeated for b. Finally, b can be seen as 2 3 4 2 3 4 2 3 4 So, a+b produces 5 8 12 6 8 10 11 10 6
سخن پایانی
از این که این مقاله را تا انتها مطالعه کردید، متشکریم. امیدواریم این راهنما به شما کمک کند که بتوانید بهره بیشتری از NumPy بگیرید. عملیات معرفیشده در این مقاله کاملاً ابتدایی هستند و ممکن است روشهای مختلفی برای رسیدن به این نتایج در NumPy وجود داشته باشند. در هر حال همواره خوب است که در صورت وجود هر گونه ابهام از مستندات NumPy کمک بگیرید.
اگر این مطلب برای شما مفید بوده است، آموزشهای زیر نیز به شما پیشنهاد میشوند:
- مجموعه آموزشهای برنامهنویسی پایتون Python
- مجموعه آموزشهای برنامهنویسی
- آموزش تکمیلی برنامه نویسی پایتون
- کتابخانه Numpy در پایتون — راهنمای سریع
- برنامه نویسی پایتون (Python) با کتابخانه NumPy — به زبان ساده
==