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

بدون ديدگاه

خب بازم سلام خدمت همه دوستان این دفعه با یه مقاله راجب ریاضیات در خدمتتون هستیم.

احتمالا میدونید یا حتی شنیدید که برای کار های هوش مصنوعی و ماشین لرنینگ و در کل ریاضیات از پایتون و متلب خیلی استفاده میشه. خب دلیل این استفاده چیه اصن؟ در کل برای کارهای هوش مصنوعی ما کلا با ریاضیات کار میکنیم و الگوریتم ها و ایده هارو با ابزار ریاضی پیاده سازی میکنیم و در نهایت تبدیل به کد میکنیم. یکی از دلایل استفاده زیاد از متلب و پایتون اینه که کار با ریاضیات و ماتریس هارو برای ما آسون میکنه. توی پایتون کتابخونه ای هست که کارهایی مثل عملیات های ماتریسی، تبدیل های ریاضی، فوریه و.. رو برای ما به سادگی انجام میده. اسم این کتابخونه Numpy هست.

  • Numpy دقیقا چیست؟

Numpy یه کتابخونه از برای پایتون هست که از Numeric هم اومده و کار های ریاضیاتی از جمله :

عملیات های منطقی و ریاضیاتی با آرایه‌ها و ماتریسها، تبدیل های فوریه، عملیات های جبرخطی، توابع برای همه این موارد و توابع اعداد رندوم و…

همه این کارها با Numpy به سادگی میشه انجام داد. خب پس واضح شد که یکی از دلایل کار زیاد با پایتون در زمینه هوش مصنوعی همین Numpy هست. چون اولین کار اینه که ما مدل ریاضی رو بسازیم که این مدل ریاضیاتی خیلی کارهاش به عهده همین Numpy هست.

حالا وقتشه بریم ببینیم این ماژول برای ما چی داره.

  • کار با Numpy:

برای اینکه این ماژول رو نصب کنید کافیه از pip کمک بگیرید:

Pip install Numpy

خوبه که اول یه مقدار راجب فلسفه آرایه توی Numpy توضیح بدیم. ببینید دوستان ما توی خود پایتون هم آرایه تعریف میکردیم برای این کار تو یه حلقه با لیست ها میتونستیم یه شکلی از ماتریس چند بعدی درست کنیم. اما آرایه ای که توی numpy تعریف میشه یه مقدار متفاوته.

  • تفاوت های list و numpy array:

اولین تفاوت اینکه ما توی list میتونیم هرچندتا نوع متغیر تعریف کنیم. مثلا int و رشته و …. اما توی numpy array ما فقط میتونیم از یه جنس همه رو تعریف کنیم.

دومین تفاوت اینه که اندازه آرایه توی numpy بعد از اینکه تعریف کردیم تغییر نمیکنه ولی توی لیست این اندازه رو به راحتی میتونیم بسط یا کم کنیم.

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

به شکل زیر دقت کنید:

این شکل یه آرایه رو توی numpy نشون میده. Type متغیر آرایه که توی numpy تعریف میکنیم بصورت ndarray هست. هر المانی داخل ndarray یه سایز و حجم یکسانی از حافظه میگیرند و type این المان ها data-type یا dtype هست.

برای ساخت یه آرایه توی numpy از numpy.array استفاده میکنیم.

این تابع رو مورد بررسی قرار میدیم.

Numpy.array(object,dtype=None,copy=True,order=None,subok=False,ndmin=0)

خب المان اول تابع داده ها و اون لیستی هست که بهش میدیم (تو مثال های پایین واضح تر معلوم میشه).

المان دوم اون type مورد دلخواه ما برای داده هاست. همچنین سایز دیتا برای مثال int32 یا float64 خب بستگی به مقدار دیتا داره که چقد فضا میخواد. خیلی خوبه که از قبل بدونید حدود مقدار داده شما چیه که این تایپ رو مقدار مناسبی بزارید که هم از یه طرف الکی حجم زیادی بگیره و از طرفی سرریز رخ نده.

المان سوم میگه که بصورت پیش فرض یه کپی از شئ میسازه و اگه بصورت false باشه میاد و یه reference از شئ میسازه.

المان چهارم: برای این المان میتونید به این مرجع مراجعه کنید.

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

المان ششم: این المان کمترین مقدار بعد رو برای آرایه result مشخص میکنه.

خب این همه المان ما معمولا کار نمیکنیم و بیشتر مواقع نهایتا دوتاشو کار داریم.

مثال:

import numpy as np
Array1=np.array([1,2,3,4],[4,3,2,1])

خروجی هم بصورت

[[۱, ۲, ۳, ۴]
[۴, ۳, ۲, ۱]]

این یه شکل از تعریف array بصورت ۳ بعدی: برای نحوه تعریف و.. به این لینک مراجعه کنید.

این هم یک مثال برای dtype:

import numpy as np
a = np.array([1, 2, 3], dtype = complex)
print (a)

خروجی:

[ ۱٫+۰٫j,  ۲٫+۰٫j,  ۳٫+۰٫j]
  • متد np.shape:

این property از کلاس array، درواقع یک tuple از ابعاد آرایه رو میده. برای مثال:

import numpy as np 
a = np.array([[1,2,3],[4,5,6]]) 
print (a.shape)

خروجی

(۲, ۳)

همچنین شما میتونید با این متد آرایه رو بعد از اینکه تعریف کنید resizeکنید. برای مثال:

import numpy as np  
a = np.array([[1,2,3],[4,5,6]]) 
a.shape = (3,2) 
print (a)

خروجی:

[[۱, ۲] 
 [۳, ۴] 
 [۵, ۶]]

این یه property از کلاس array بود. شبیه همین ما یه تابع داریم که مثلا میتونیم این رو خروجی بدیم به یه متغیر دیگ. این تابع ()reshape

import numpy as np 
a = np.array([[1,2,3],[4,5,6]]) 
b = a.reshape(3,2) 
print (b)
[[۱, ۲]
 [۳, ۴]
 [۵, ۶]]

همچنین متد ndim به ما تعداد بعد رو میده.

و همچنین تابع ()arrange به ما یه آرایه از اعداد ۰ تا یه دونه قبل اون مقدار عددی که بهش ورودی میدیم رو میده.

import numpy as np
a = np.arange(24)
print (a)
[۰ ۱  ۲  ۳  ۴  ۵  ۶  ۷  ۸  ۹  ۱۰  ۱۱  ۱۲  ۱۳  ۱۴  ۱۵  ۱۶ ۱۷ ۱۸ ۱۹ ۲۰ ۲۱ ۲۲ ۲۳]

یه مثال کامل تر از این چزایی که خوندیم رو داشته باشیم:

# this is one dimensional array
import numpy as np 
a = np.arange(24) 
a.ndim   
# now reshape it 
b = a.reshape(2,4,3) 
print (b) 
# b is having three dimensions
[[[ ۰,  ۱,  ۲] 
  [ ۳,  ۴,  ۵] 
  [ ۶,  ۷,  ۸] 
  [ ۹, ۱۰, ۱۱]]  
  [[۱۲, ۱۳, ۱۴]  
  [۱۵, ۱۶, ۱۷]  
  [۱۸, ۱۹, ۲۰]  
  [۲۱, ۲۲, ۲۳]]]

متد itemsize: این متد به ما تعداد بایت هریک از المان های آرایه رو میده.

import numpy as np
x = np.array([1,2,3,4,5], dtype = np.int8) 
print (x.itemsize)

خروجی:

۱
import numpy as np 
x = np.array([1,2,3,4,5], dtype = np.float32) 
print (x.itemsize)

خروجی:

۴

Flags: هم یه سری خروجی اطلاعاتی در مورد آرایه مون رو میده.

import numpy as np 
x = np.array([1,2,3,4,5]) 
print (x.flags)

خروجی:

C_CONTIGUOUS : True 
F_CONTIGUOUS : True 
OWNDATA : True 
WRITEABLE : True 
ALIGNED : True 
UPDATEIFCOPY : False

برای اینکه از بحث خیلی خارج نشیم برای اینکه این مقادیر ببینید دقیقا چی هستن به این لینک مراجعه کنید.

روش های ساخت یک ndarray:

  • Numpy.empty

دقیقا مثل شکل، یعنی یه برگه (آرایه) درست میکنه اما خالیه!

یک آرایه درست میکنه که data ها مشخص نشده اند و فقط یه شکلی از آرایه هست. برای مثال:

import numpy as np
x = np.empty([3,2], dtype = int)
print x
[[۲۲۶۴۹۳۱۲    ۱۷۰۱۳۴۴۳۵۱]
 [۱۸۱۸۳۲۱۷۵۹  ۱۸۸۵۹۵۹۲۷۶]
 [۱۶۷۷۹۷۷۶    ۱۵۶۳۶۸۸۹۶]]

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

  • Numpy.zeros

این تابع یک ماتریس صفر به اندازه ای که بهش میدیم درست میکنه. برای مثال:

# array of five zeros. Default dtype is float
import numpy as np
x = np.zeros(5)
print (x)
[ ۰٫  ۰٫  ۰٫  ۰٫  ۰٫]
import numpy as np
x = np.zeros((5,), dtype = np.int)
print (x)
[۰  ۰  ۰  ۰  ۰]
# custom type 
import numpy as np 
x = np.zeros((2,2), dtype = [('x', 'i4'), ('y', 'i4')])  
print (x)
[[(۰,۰)(۰,۰)]
 [(۰,۰)(۰,۰)]]
  • Numpy.ones

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

# array of five ones. Default dtype is float 
import numpy as np 
x = np.ones(5) 
print (x)
[ ۱٫  ۱٫  ۱٫  ۱٫  ۱٫]
import numpy as np 
x = np.ones([2,2], dtype = int) 
print (x)
[[۱  ۱] 
 [۱  ۱]]
  • Numpy.asarray

با این تابع میتونیم ما مثلا یه لیستی که تو پایتون نوشتیم رو به ndarray تبدیل کنیم. همچنین این تابع ورودی های کمتری نسبت به numpy.array داره. برای مثال:

# convert list to ndarray 
import numpy as np  
x = [1,2,3] 
a = np.asarray(x) 
print (a)
[۱  ۲  ۳]
# dtype is set 
import numpy as np  
x = [1,2,3]
a = np.asarray(x, dtype = float)
print (a)
[ ۱٫  ۲٫  ۳٫]
# ndarray from list of tuples 
import numpy as np  
x = [(1,2,3),(4,5)] 
a = np.asarray(x) 
print (a)
[(۱, ۲, ۳) (۴, ۵)]
  • Numpy.frombuffer

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

numpy.frombuffer(buffer,dtype=floatcount=-1offset=0)

ورودی اول خود بافر یا رشته رو میگیره. ورودی دوم type رو. ورودی سوم تعداد دیتاهایی که باید بخونه مثلا -۱ یعنی همه دیتای های داخل بافر و ورودی چهارم offset هست یعنی اینکه از خونه چندم به بعد رو بخونه. به مثال زیر توجه کنید:

>>> s = b'hello world'
>>> np.frombuffer(s, dtype='S1', count=5, offset=6)
array([b'w', b'o', b'r', b'l', b'd'], dtype='|S1')
>>> np.frombuffer(b'\x01\x02', dtype=np.uint8)
array([1, 2], dtype=uint8)
>>> np.frombuffer(b'\x01\x02\x03\x04\x05', dtype=np.uint8, count=3)
array([1, 2, 3], dtype=uint8)
  • numpy.fromiter:

این تابع درواقع از یه شئ قابل شمارش، آرایه میسازه. برای مثال:

>>> iterable = (x*x for x in range(5))
>>> np.fromiter(iterable, float)
array([  ۰٫,   ۱٫,   ۴٫,   ۹٫,  ۱۶٫])
# obtain iterator object from list 
import numpy as np 
list = range(5) 
it = iter(list)   
# use iterator to create ndarray 
x = np.fromiter(it, dtype = float) 
print (x)
[۰٫   ۱٫   ۲٫   ۳٫   ۴٫]

همونطوری که میبینید معمولا با تابع range بکار میره که یه لیست خروجی میده بصورت ۵ عدد به ترتیب و شروعش از ۰ هست.

در قسمت بعدی وارد تابع های خوب و کاربردی این کتابخونه میشیم.

نوشتن دیدگاه

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