آموزش کتابخانه Numpy قسمت دوم

بدون ديدگاه

سلام خدمت همه دوستان.

در این مقاله با قسمت دوم از مقاله numpy در خدمت شما هستیم. اگر قسمت اول را مطالعه نکردید و میخواهید ببینید که چه مسیری رو طی کردیم به این لینک مراجعه کنید.

در این قسمت یک سری دیگ از توابع numpy رو میخوایم با هم یاد بگیریم و یه سری مینی پروژه هم انجام میدیم باهاشون. پس همراه ما باشید ؛)

  • numpy.arange

این تابع یه سری عدد در بازه و step که ما مشخص میکنیم تولید میکنه.

numpy.arange(start, stop, step, dtype)

start: بازه ابتدایی. بصورت پیشفرض ۰ در نظر گرفته میشه.

Stop: انتهای بازه. دقت کنید که این بازه به این صورت هست : [start,stop) یعنی خود بازه انتهایی در نظر گرفته نمیشه.

Step: فاصله بین هر دو عدد هست. یعنی پله ای که ما بهش میدیم. بصورت پیشفرض ۱ هست.

Dtype: این هم که تو همه تابع ها داشتیم. بصورت پیشرفض هم type ورودی رو درنظر میگیره.

مثال:

#Example1
import numpy as np 
x = np.arange(5)
print (x)

پاسخ:

[۰  ۱  ۲  ۳  ۴]
#Example2
import numpy as np 
# dtype set 
x = np.arange(5, dtype = float)
print (x)

پاسخ:

[۰٫  ۱٫  ۲٫  ۳٫  ۴٫]

در مثال دوم ما type رو مشخص کردیم واسه همین اعداد با ممیز چاپ شده اند که نشون میده float هست.

#Example3
# start and stop parameters set 
import numpy as np 
x = np.arange(10,20,2) 
print (x)

پاسخ:

[۱۰  ۱۲  ۱۴  ۱۶  ۱۸]

در این مثال هم ما step رو مشخص کردیم واسه همین فاصله بین هر دوعدد ۲ است.

  • numpy.linspace

این یکی از تابع های پرکاربرد از این کتابخونه هست. این تابع شبیه تابع قبلی هست اما یک مدل دیگ ای. مثلا شما فرض کنید بین دوتا عدد a و b به تعداد cتا عدد نیاز دارید. بهترین راه استفاده از این تابع هست.

numpy.linspace(start, stop, num, endpoint, retstep, dtype)

المان های اول و دوم مثل تابع قبل هستن. ولی اگه المان endpoint بصورت True باشه، بازه انتهایی درنظر گرفته میشه.

Num: تعداد اعدادی که میخوایم تولید بشه.

Endpoint: در بالا توضیح دادیم و بصورت پیشفرض بصورت True هست.

Retstep: اگه بصورت True باشه مقدار step رو که خودش محاسبه کرده هم خروجی میده.

المان چهارمم که دیگ نیاز به توضیح نداره.

مثالها:

#Example1
import numpy as np 
x = np.linspace(10,20,5) 
print (x)

پاسخ:

[۱۰٫   ۱۲٫۵   ۱۵٫   ۱۷٫۵  ۲۰٫]

 

#Example2
# endpoint set to false 
import numpy as np 
x = np.linspace(10,20, 5, endpoint = False) 
print (x)

پاسخ:

[۱۰٫   ۱۲٫   ۱۴٫   ۱۶٫   ۱۸٫]
#Example3
# find retstep value 
import numpy as np  
x = np.linspace(1,2,5, retstep = True) 
print (x) 
# retstep here is 0.25

پاسخ:

(array([ 1.  ,  ۱٫۲۵,  ۱٫۵ ,  ۱٫۷۵,  ۲٫  ]), ۰٫۲۵)

دقت کردید که dtype پیشفرض بصورت float هست.

  • numpy.logspace

این تابع هم اعدادی میده بین بازه هایی که مشخص میکنیم که البته این بازه های توانی از عدد ۱۰ هستند. یعنی مثلا اگر ابتدای بازه رو ۱ بزاریم و انتهارو ۲ بزاریم میشه بین اعداد ۱۰ تا ۱۰۰٫ البته میتونیم این مبنای لگاریتم رو عوض کنیم.

numpy.logspace(start, stop, num, endpoint, base, dtype)

همه المان ها مشخص هست مثل توابع قبلی تنها المان:

Base: میشه مبنای لگاریتم که بصورت پیشفرض ۱۰ هست.

مثالها:

#Example1
import numpy as np 
# default base is 10 
a = np.logspace(1.0, 2.0, num = 10) 
print (a)

پاسخ:

[ ۱۰٫           ۱۲٫۹۱۵۴۹۶۶۵     ۱۶٫۶۸۱۰۰۵۳۷      ۲۱٫۵۴۴۳۴۶۹  ۲۷٫۸۲۵۵۹۴۰۲        ۳۵٫۹۳۸۱۳۶۶۴   ۴۶٫۴۱۵۸۸۸۳۴     ۵۹٫۹۴۸۴۲۵۰۳      ۷۷٫۴۲۶۳۶۸۲۷    ۱۰۰٫    ]

 

#Example2
# set base of log space to 2 
import numpy as np 
a = np.logspace(1,10,num = 10, base = 2) 
print (a)

پاسخ:

[ ۲٫     ۴٫     ۸٫    ۱۶٫    ۳۲٫    ۶۴٫   ۱۲۸٫   ۲۵۶٫    ۵۱۲٫   ۱۰۲۴٫]

حالا بریم یه مینی پروژه با اینا انجام بدیم. اساسا با این توابع اکثرا رسم نمودار انجام میدن. البته این توابع تو خیلی جاهای دیگ هم کاربرد داره. هرجا که نیاز به تولید یه سری عدد داشته باشیم که البته نظم داشته باشن و تصادفی نباشن.

  • مینی پروژه:

میخوایم تابع ۲X+2 رو رسم کنیم. فقط برای رسم کردن این تابع ما نیاز به کتابخونه matplotlib داریم که کتابخونه ساده هست برای رسم کردن کلی نمودار و شکل ها بکار میره. فرصت شد حتما آموزش این کتابخونه هم در سایت قرارمیدیم.

کد بصورت زیر هست:

#Project
import numpy as np
import matplotlib.pyplot as plt
x=np.linspace(0,10,50)
y=2*x+2
plt.plot(x,y)
plt.show()

خب در خط اول اومدیم کتابخونه numpy رو برای سادگی بصورت np، import کردیم که خیلی مرسوم هست. در خط بعدی کتابخونه matplotlib.pyplot رو بصورت plt، import کردیم.

بعدش میایم به تعداد ۵۰ تا عدد بین اعداد ۰ و ۱۰ تولید میکنیم. بعدش خروجی تابع رو همونطور که میخوایم بصورت ۲*X+2 مینویسیم. دقت کنید که الان جفت x و y بصورت یک لیست هستند. حالا از کتابخونه matplotlib کمک میگیریم و این دو متغیر هارو بر حسب هم رسم میکنیم. خروجی شکل زیر میشه:

که دقیقا چیزی که ما میخوایم هست.

این تنها یک کاربرد کوچیک از این توابع numpy هست.

خب بریم ادامه مقاله:

  • Slicing

یکی از مهم ترین مباحثی که در numpy مطرح هست مبحث slicing هست. یعنی مثلا شما یک سری عدد دارید در یک بازه مشخصی و یا حتی نامشخص و میخواید تنها یک برشی از این بزنید یعنی یک تیکه از این اعداد رو احتیاج دارید. پس بریم باهم یه برشی بزنیم J.

Slice(start,stop,step)

که همگی مشخص هستند تقریبا. آرگومان اول برای ابتدای بازه، آرگومان دوم برای انتهای بازه و آرگومان سوم برای فاصله بین هر دو عدد.

مثالها:

#Example1
import numpy as np 
a = np.arange(10) 
s = slice(2,7,2) 
print (a[s])

پاسخ:

[۲  ۴  ۶]

یک مدل دیگ برای slicing این مدل هست که توی خود لیست این سه آرگومان رو مشخص کنیم. توی مثال پایین بهتر متوجه میشید:

#Example2
import numpy as np 
a = np.arange(10) 
b = a[2:7:2] 
print (b)

پاسخ:

[۲  ۴  ۶]

در واقع ۲ برای ابتدای بازه، ۷ برای انتهای بازه و ۲ برای step هست.

همچنین اگر ما فقط یه عدد خواستیم:

#Example3
# slice single item 
import numpy as np  
a = np.arange(10) 
b = a[5] 
print (b)

پاسخ:

۵

اگه توی همین مثال ما عدد [:۲]a میزاشتیم کل اعداد از ۲ به بعد رو خروجی میداد:

#Example4
# slice items starting from index 
import numpy as np 
a = np.arange(10) 
print (a[2:])

پاسخ:

[۲  ۳  ۴  ۵  ۶  ۷  ۸  ۹]

همچنین یه مدل دیگ:

#Example5
# slice items between indexes 
import numpy as np 
a = np.arange(10) 
print (a[2:5])

پاسخ:

[۲  ۳  ۴]

یه مثال خفن هم ببینیم:

#Khafan Example!!!
# array to begin with 
import numpy as np 
a = np.array([[1,2,3],[3,4,5],[4,5,6]])  
print ('Our array is:') 
print (a) 
print ('\n')
   
# this returns array of items in the second column 
print ('The items in the second column are:')  
print (a[...,1]) 
print ('\n')
   
# Now we will slice all items from the second row 
print ('The items in the second row are:') 
print (a[1,...]) 
print ('\n')
   
# Now we will slice all items from column 1 onwards 
print ('The items column 1 onwards are:') 
print (a[...,1:])

پاسخ:

Our array is:
[[۱ ۲ ۳]
 [۳ ۴ ۵]
 [۴ ۵ ۶]]  
The items in the second column are: 
[۲ ۴ ۵]  
The items in the second row are:
[۳ ۴ ۵] 
The items column 1 onwards are:
[[۲ ۳]
 [۴ ۵]
 [۵ ۶]]

در واقع کاری که انجام شده [۱,…]a اومده توی ستون ها کارکرده. یعنی اینکه ستون ۱ که میشه ستون دوم از آرایه رو چاپ کن. و همچنین […,۱]a میگه که سطر دوم رو چاپ کن. در انتها [:۱,…]a میگه که بیا تو قسمت ستون ها و ستون های دوم به بعد رو چاپ کن. به دو نکته دقت کنید، نکته اول اینکه اندیس ها از ۰ شروع میشن. نکته دوم اینکه این آرایه از جنس ndarray بود.

در انتها میخوایم مبحث indexing رو با هم یادبگیریم.

  • Indexing

تفاوتی که indexing با slicing داره اینه که در indexing ما یه کپی از data رو داریم ولی در slicing ما یه view از data رو داریم. ما دو مدل indexing داریم. یکی از جنس integer و یکی از جنس Boolean.

Integer Indexing

در این نحوه ما میایم و آدرس اون دیتا رو مشخص میکنیم. بریم روی مثالها توضیح بدیم:

#Example1
import numpy as np
x = np.array([[1, 2], [3, 4], [5, 6]])
y = x[[0,1,2], [0,1,0]]
print (y)

پاسخ:

[۱  ۴  ۵]

خب اولا که ما یه آرایه ۳*۲ داریم. ما اومدیم اعدادی رو مشخص کردیم که دارای آدرس های زیر هستن:

(۰,۰),(۱,۱),(۲,۰). یعنی اعداد ۱,۴,۵٫

یعنی آدرس سطر و ستون های اعدادی که میخوایم رو دادیم.

مثال بعدی:

#Example2
import numpy as np
x = np.array([[ 0,  ۱,  ۲],[ ۳,  ۴,  ۵],[ ۶,  ۷,  ۸],[ ۹, ۱۰, ۱۱]])
print ('Our array is:')
print (x)
print ('\n')
rows = np.array([[0,0],[3,3]])
cols = np.array([[0,2],[0,2]])
y = x[rows,cols]
print ('The corner elements of this array are:')
print (y)

پاسخ:

Our array is:
[[ ۰  ۱  ۲]
 [ ۳  ۴  ۵] 
 [ ۶  ۷  ۸]
 [ ۹ ۱۰ ۱۱]] 
The corner elements of this array are:
[[ ۰  ۲]
 [ ۹ ۱۱]]

توی این مثال ما اومدیم منظم تر آدرس این چهارتا عدد رو دادیم. درواقع row هارو توی یک متغیر و column هارو توی یک متغیر دیگ. درواقع آدرس این چهارتا عدد:

[۰,۰],[۰,۲],[۳,۰],[۳,۲] هستند.

یه مثال دیگ:

# Example3
import numpy as np 
x = np.array([[ 0,  ۱,  ۲],[ ۳,  ۴,  ۵],[ ۶,  ۷,  ۸],[ ۹, ۱۰, ۱۱]])
print ('Our array is:') 
print (x) 
print ('\n')   
# slicing 
z = x[1:4,1:3]  
print ('After slicing, our array becomes:') 
print (z)
print ('\n')
# using advanced index for column 
y = x[1:4,[1,2]]  
print ('Slicing using advanced index for column:') 
print (y)

پاسخ:

Our array is:
[[ ۰  ۱  ۲]
 [ ۳  ۴  ۵] 
 [ ۶  ۷  ۸] 
 [ ۹ ۱۰ ۱۱]] 
After slicing, our array becomes:
[[ ۴  ۵] 
 [ ۷  ۸] 
 [۱۰ ۱۱]] 
Slicing using advanced index for column:
[[ ۴  ۵] 
 [ ۷  ۸] 
 [۱۰ ۱۱]]

خب ما توی این مدل اومدیم بصورت یک تعداد ستون و سطر آدرس دادیم. اولی [۱:۴,۱:۳]x یعنی بیا سطر ۱ تا ۳ (دقت کنید که ۴ شامل نمیشه در واقع بازه بصورت [۱,۴) ) و ستون ۱ تا ۲ رو انتخاب کن. دومی هم [[۱,۲],۱:۴]x یعنی بیا سطر ۱ تا ۳ و ستون ۱ و ۲ رو خروجی بده.

Boolean Array Indexing

این مدل در واقع صورت “درست” یا “غلط” هست که مثلا میتونه با عملگر های مقایسه ای انجام بشه.

مثالها:

#Example1
import numpy as np
x = np.array([[ 0,  ۱,  ۲],[ ۳,  ۴,  ۵],[ ۶,  ۷,  ۸],[ ۹, ۱۰, ۱۱]])
print ('Our array is:')
print (x)
print ('\n') 
# Now we will print the items greater than 5
print ('The items greater than 5 are:')
print (x[x > 5])

خروجی:

Our array is: 
[[ ۰  ۱  ۲]  
 [ ۳  ۴  ۵]  
 [ ۶  ۷  ۸]  
 [ ۹ ۱۰ ۱۱]] 
The items greater than 5 are:
[ ۶  ۷  ۸  ۹ ۱۰ ۱۱]

توی این مثال ما اومدیم گفتیم هر عددی که از ۵ بیشتر بود رو خروجی بده.

#Example2
import numpy as np 
a = np.array([np.nan, 1,2,np.nan,3,4,5]) 
print (a[~np.isnan(a)])

پاسخ:

[ ۱٫   ۲٫   ۳٫   ۴٫   ۵٫]

توی این مثال (که استفاده زیادی هم نداره)، اومدیم اول یه ndarray ساختیم با المان های شامل عدد و Nan. بعدش اومدیم اون عناصری که شرط (np.isnan(a~ رو دارن خروجی دادیم (دقت کنید که ~ یعنی متمم عبارت جلوش یعنی مثلا اینجا میشه عناصری که np.isnan نباشن یعنی nan نباشن).

#Example3
import numpy as np 
a = np.array([1, 2+6j, 5, 3.5+5j]) 
print (a[np.iscomplex(a)])

پاسخ:

[۲٫۰+۶٫j  ۳٫۵+۵٫j]

در اینجا هم اول اومدیم یه ndarray از اعداد حقیقی و موهومی درست کردیم بعدش اومدیم اوع عناصری که شرط (np.iscomplex(a رو دارن خروجی دادیم. یعنی اعدادی که موهومی هستند.

خب این هم از مقاله دوم numpy. تا قسمت بعدی Numpy خدانگهدارتون.

 

 

 

نوشتن دیدگاه

نشانی ایمیل شما منتشر نخواهد شد.