آموزش Numpy – بخش دوم {کار با ماتریس ها}

مقدمه

در جلسه دوم آموزش Numpy قصد داریم در مورد آرایه های یک بعدی و دو بعدی و کار با‌ آنها در numpy صحبت کنیم. در جلسه قبل ما به صورت کلی با Numpy آشنا شدیم و برخی از متدهای آن را با هم مرور کردیم. در این جلسه به صورت تخصصی میخواهیم با آرایه های یک بعدی و دو بعدی کار کنیم. البته برخی از متدهایی که در این جلسه با آنها آشنا می شویم در جلسه قبل آورده شده است. لینک جلسه قبل در زیر آورده شده است :‌

نکته : دوستان عزیز ، خواندن این جلسه به تنهایی کافی نمی باشد و یادگیری عمیقی برای شما ایجاد نخواهد کرد. لطفا یک ادیتور باز کنید و تمامی کدهایی که در ادامه جلسه آورده می شوند را خودتان امتحان کنید و گام به گام با آموزش پیش بروید تا تمامی این آموزش ها را یک بار برای همیشه یاد بگیرید. 

ایجاد و کار با آرایه های یک بعدی

۱-  ایجاد یک آرایه :

همانطور که در جلسه پیش دیدیم میتوانیم به کمک متد array یک آرایه تک بعدی را ایجاد کنیم. مثال زیر را ببینید :‌

a = np.array([15,25,14,78,96])
a
print(a)

توجه داشته باشید که حتما باید از براکت برای ایجاد آرایه خود استفاده کنید. اگر براکت را قرار ندهید با خطا مواجه خواهید شد. برای نمایش یک آرایه نیز میتوان از دستور print استفاده کرد.

۲- تغییر نوع داده ی یک آرایه :‌

متد array یک پارامتر ورودی دلخواه dtype میگیرد که مشخص می کند نوع داده ی مربوط به آرایه تعریف شده چه چیزی باشد. آن نوع داده یک int باشد یا float یا یک عدد مختلط. در مثال زیر نوع داده های مربوط به آرایه خود را به float تغییر داده ایم.

a.dtype
a = np.array([15,25,14,78,96],dtype = "float")
a
a.dtype

نوع داده ای که در ابتدا خود numpy به داده ها اختصاص می دهد ، int32 می باشد و ما آن را به float64 تغییر داده ایم. شاید بد نباشد به صورت خلاصه این دو نوع داده را با یکدیگر بشناسیم:

 

نوع داده int32 :‌ منظور از int آن است که عدد ما اعشاری نباشد و منظور از 32 این است که این عدد میتواند بین -2147483648  تا 2147483647 باشد. نیازی به گفتن نیست که فاصله این دو عدد همان ۲ به توان ۳۲ می باشد. به همین ترتیب منظور از int16 آن است که یک عدد صحیح بین -32768 تا 32767 تعریف کرده ایم.

نوع داده float64 ‌: نوع داده float در واقع مربوط به داده های اعشاری است. در مورد ۶۴ نیز بحث کمی طولانی تر است و نیاز به برخی مقدمات دارد تا دقیقا متوجه شویم که منظور از آن چیست. سعی میکنیم در یک جلسه به صورت کامل در مورد انواع داده های یک آرایه به صورت کامل صحبت کنیم.

۳- ایجاد یک آرایه از اعداد متوالی :‌

در صورتی که قصد داشته باشیم یک آرایه از اعداد متوالی ایجاد کنیم میتوانیم از دستور arange استفاده کنیم. دو پارامتر مهم این متد start و stop می باشد که به کمک آن تعیین میکنیم ، شروع آرایه و اتمام آن کجا باشد. مثال زیر این موضوع را روشن می کند :‌

b = np.arange(start = 20,stop = 30) 
b

توجه کنید که آرایه ساخت شده تا یک عدد قبل از stop می باشد و خود stop را در نظر نمیگیرد.

۴- ایجاد یک آرایه از اعداد با تعریف گام :‌

اگر بخواهیم یک آرایه از اعداد ایجاد متوالی ایجاد کنیم و دوست داشته باشیم که آن اعداد یک فاصله مشخصی از یکدیگر داشته باشند در این صورت میتوانیم پارامتر سوم تابع arange را برابر مقدار گام خود قرار دهیم. در مثال زیر اعداد بین ۲۰ تا ۳۰ با فاصله ۲ مشخص شده اند:

c = np.arange(20,30,2)   #30 is excluded.
c 

در حالت عادی پارامتر سوم با مقدار ۱ عدد گذاری شده است.

۵- تغییر شکل دادن یک آرایه :‌

برای تغییر شکل دادن یک آرایه میتوان از دو متد reshape و resize استفاده کرد. مثال زیر را ببینید‌:

f = np.arange(101,113)
f.reshape(3,4)
f

اگر کد بالا را اجرا کنیم ، نتیجه به صورت زیر خواهد بود‌:

 array([101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112])

همانطور که میبینیم ، شکل آرایه تغییر نکرده است. علت این موضوع این می باشد که متد reshape شکل آرایه اصلی را به صورت درجا تغییر نمی دهد. برای تغییر درجای شکل آرایه از متد resize میتوانیم استفاده کنیم. مثال زیر را ببینید‌:

f.resize(3,4)
f

که با اجرای این کد خواهیم داشت :

array([[101, 102, 103, 104],
       [105, 106, 107, 108],
       [109, 110, 111, 112]])

در صورتی که یکی از پارامترهای ورودی مربوط به این متد را برابر منفی ۱ قرار دهیم ، پارامتر دوم به صورت اتوماتیک مطابق با آرایه محاسبه می شود. مثال زیر را ببینید‌:

     f.reshape(3,-1)

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

array([[101, 102, 103, 104],
       [105, 106, 107, 108],
       [109, 110, 111, 112]])

در کد بالا تعداد ردیف ها ۳ قرار داده شده اند و تعداد ستون ها مطابق با تعداد اعضای آرایه محاسبه شده اند.

۶- داده از دست رفته ‌:

در numpy یک داده از دست رفته با Nan مشخص می شود. این کلمه مخفف عبارت Not A Number می باشد و میتوانیم از آن با نام np.nan استفاده کنیم. در زیر مثالی از این موضوع آورده شده است :

     val = np.array([15,10, np.nan, 3, 2, 5, 6, 4]) 

حال اگر بخواهیم جمع آرایه تعریف شده در بالا را محاسبه کنیم از متد sum کمک میگیریم و خواهیم داشت :‌

val.sum()
Out: nan

که میبینید به علت حضور np.nan در یک آرایه ، جمع آن به صورت nan محاسبه شده است.

برای این که پارامترهای nan در نظر گرفته نشوند و جمع اعداد آرایه بدون nan محاسبه شوند ، میتوانید از متد np.nansum استفاده کنید ، که در صورت استفاده خروجی آن برابر با ۴۵ می شود.

همچنین برای این که چک کنید که یک آرایه شامل Nan می باشد یا خیر میتوانید از متد isnan استفاده کنید. مثالی از این متد در زیر آورده شده است:

np.isnan(val) 

کار با آرایه های دو بعدی

۱- ساخت یک آرایه دو بعدی‌:

یک آرایه دو بعدی را میتوان به دو روش زیر ساخت. این دو روش در زیر آورده شده است :‌

g = np.array([(10,20,30),(40,50,60)])
#Alternatively
g = np.array([[10,20,30],[40,50,60]])
g

همانطور که میبینید برای این کار میتوانیم از پرانتز و یا براکت استفاده کنیم.

اندازه و مجموع اعداد المان ها و شکل یک آرایه دو بعدی به کمک متدهای ndim و size و shape مشخص می شود.

g.ndim
g.size
g.shape

نتیجه اجرای کدهای بالا به صورت زیر می باشد‌:

g.ndim
Output: 2

g.size
Output: 6

g.shape
Output: (2, 3)

۲- ایجاد برخی از ماتریس های متداول ‌:

یکی از خوبی های مربوط به numpy این است که به ما این اجازه را میدهد که برخی از ماتریس هایی که از آنها در جبر خطی به وفور استفاده می شود ، به آسانی ایجاد کنیم. در زیر مثال هایی از این ماتریس ها‌ آورده شده اند :

الف : ساخت یک ماتریس صفر : برای ساخت یک ماتریس صفر میتوانید از متد zeros  استفاده کنیم. به عنوان مثال اگر بخواهیم یک ماتریس با ۴ ستون و ۲ ردیف صفر بسازیم ، در این صورت خواهیم داشت :‌

     np.zeros( (2,4) )

که نتیجه آن به صورت زیر می باشد :

array([[ 0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.]])

به صورت پیش فرض نوع داده ی مربوط به یک ماتریس صفر float می باشد. میتوانیم به کمک پارامتر dtype این نوع داده را عوض کنیم. در زیر نوع داده ماتریس به int16 تغییر داده شده است :

     np.zeros([2,4],dtype=np.int16)       

ب :‌ساخت یک ماتریس با اعداد تصادفی :

برای ایجاد یک ماتریس با اعداد تصادفی بین ۰ تا ۱ میتوانید از متد empty استفاده کنید :‌

     np.empty( (2,3) )       

که با اجرای این کد خواهیم داشت :

array([[  2.16443571e-312,   2.20687562e-312,   2.24931554e-312],
       [  2.29175545e-312,   2.33419537e-312,   2.37663529e-312]])

توجه داشته باشید که با هر بار اجرای این کد ، ماتریس متفاوتی نتیجه می شود.

ج :‌ ایجاد یک ماتریس از اعداد یک :

برای ایجاد یک ماتریس از اعداد یک میتوانیم از متد ones استفاده کنیم. پارامترهای ورودی این ماتریس تعداد سطرها و تعداد ستون های ماتریس می باشد. مثال زیر را ببینید‌:

     np.ones([3,3])

نتیجه اجرای کد بالا به صورت زیر است :‌

array([[ 1.,  1.,  1.],
       [ 1.,  1.,  1.],
       [ 1.,  1.,  1.]])

د : ساخت یک ماتریس diagonal :

برای ساخت یک ماتریس diagonal میتوان از دستور diag استفاده کرد. منظور از از یک ماتریس diagonal ، ماتریسی است که قطر اصلی آن یک مقدار دارند و بقیه عناصر آن صفر می باشد. توجه کنید که این ماتریس یک ماتریس مربعی می باشد.

در زیر نمونه از یک ماتریس diagonal آورده شده است :‌

     np.diag([14,15,16,17])

که نتیجه این کد به صورت زیر می باشد:

array([[14,  0,  0,  0],
       [ 0, 15,  0,  0],
       [ 0,  0, 16,  0],
       [ 0,  0,  0, 17]])

ه :‌ ایجاد یک ماتریس همانی

برای ساخت یک ماتریس همانی (ماتریسی مربعی با درایه های ۱ در قطر اصلی و صفر در سایر درایه ها) میتوان از متد eye استفاده کرد. مثال زیر را ببینید‌:

     np.eye(5,dtype = "int")

همانطور که میبینید از دو پارامتر ورودی استفاده شده است. پارامتر اول اندازه ماتریس ایجاد شده است و پارامتر دوم نوع داده های ماتریس می باشد. نتیجه اجرای کد بالا به صورت زیر می باشد‌:‌

array([[1, 0, 0, 0, 0],
       [0, 1, 0, 0, 0],
       [0, 0, 1, 0, 0],
       [0, 0, 0, 1, 0],
       [0, 0, 0, 0, 1]])

به صورت پیش فرض نوع داده های ماتریس eye ، از نوع float می باشد و ما آن را به int تغییر داده ایم.

۳- تغییر شکل یک آرایه دو بعدی :

برای این که یک ماتریس دو بعدی را به یک ماتریس یک بعدی تبدیل کنید و همه درایه های آن را در یک بردار بریزید میتواند از متد ravel استفاده کرد:

g = np.array([(10,20,30),(40,50,60)])
g.ravel()  

نتیجه اجرای کد بالا به صورت زیر است ‌:

 array([10, 20, 30, 40, 50, 60])

مشابه با آرایه های یک بعدی برای تغییر شکل میتوان از متدهای resize و reshape استفاده کرد. متد reshape آرایه را به صورت درجا تغییر نمی دهد ولی resize این کار را می کند. در زیر مثالی از تغییر شکل یک آرایه دو بعدی به کمک resize را مشاهده میکنید.

 g.resize((3,2))
g   #resize modifies the original array

نتیجه اجرای کد بالا به صورت زیر می باشد:‌

array([[10, 20],
       [30, 40],
       [50, 60]])

در پایان این جلسه برای درک بهتر چند تمرین زیر را انجام دهید:‌

تمارین:

 تمرین ۱ :به کمک numpy اعداد زوج بین ۱۰ تا ۲۰ را جدا کنید. (خود ۲۰ نیز جزیی از اعداد جدا شده باشد. )

 تمرین ۲ : تحقیق کنید ، در صورتی که هنگام تغییر شکل یک آرایه یک بعدی از پارامتر -۱ استفاده میکنیم و پایتون قصد داشته باشد به صورت اتوماتیک این پارامتر را تنظیم کند ولی تعداد اعضای آن آرایه طوری باشد که قابل تنظیم کردن نباشد ، چه اتفاقی می افتد ؟

 تمرین ۳ : برنامه ای بنویسید که تعداد اعضای یک آرایه تک بعدی که nan هستند را در خروجی به ما نمایش دهد. مثلا اگر آرایه یک بعدی ما به صورت p = np.array([5,10, np.nan, 3, 2, 5, 6, np.nan])  باشد ، خروجی آن باید ۲ که تعداد nan ها است ، باشد.

نکته :  پس از حل سوالات ، لطفا  کد های خود را در قسمت کامنت ها قرار دهید تا در صورتی که دوستان دیگر دچار مشکل شدند ، از کدهای شما کمک بگیرند. 

مثل همیشه میتوانید ما را در تلگرام و یا اینستاگرام دنبال کنید:

 

اشتراک گذاری:
مطالب زیر را حتما بخوانید

دیدگاهتان را بنویسید