پایتون (نامپای) برای کاربران متلب و متلب برای کاربران پایتون

دسته‌بندی: برنامه‌نویسی

آرش صمدی

ایجاد: پنج‌شنبه 24 خرداد 1403 20:49

بروزرسانی: دوشنبه 06 اسفند 1403 19:08

برنامه‌نویسی علمی/محاسباتی یکی از مهم‌ترین ابزارها در جعبه مهارت‌های مورد نیاز برای محققین و مهندسین محسوب می‌شود. استفاده عمده این ابزار در مدل‌سازی کامپیوتری مسائل پیچیده مهندسی و شبیه‌سازی یک پدیده و یا تحلیل داده‌های فنی است. در بین انتخاب‌های موجود در زمینه برنامه‌نویسی علمی کتابخانه نامپای (numpy) با زبان برنامه‌نویسی پایتون و نرم‌افزار متلب دو نمونه از پرکاربرترین موارد هستند. در این مقاله که بر اساس مقاله‌ای با همین نام در وبسایت numpy منتشر شده، سعی بر آن است تا پلی میان دستورات پرکاربرد در هر دو زبان ایجاد شود. لازم به ذکر است که این مقاله به هیچ وجه نقطه خوبی برای شروع یادگیری این دو زبان نبوده و برای استفاده از آن حداقل تسلط نسبی به یکی از زبانها نیاز است. از همین رو ویدلتا در نظر دارد تا با طراحی دوره‌های آموزشی منحصر به فرد نسبت به ارائه محتوی آموزشی کاربرد محور اقدام نماید. انتشار هر یک از دوره‌ها از طریق همین وبسایت به اطلاع علاقه‌مندان خواهد رسید.

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

متلب و نامپای اشتراکات فراوانی دارند هرچند که ضمن اشتراکات بیشمار تفاوت‌های جدی‌ میان این دو ابزار محاسباتی وجود دارد. لذا پیش از هرچیزی ذکر این نکته واجب است که مطالب عنوان شده لزوما شامل همه دستورات نمی‌شوند. یعنی لزوما همه ابزارهای بهینه‌سازی و تسریع برنامه‌نویسی در متلب ترجمه یک به یک در نامپای نداشته و همه امکانات نامپای نیز لزوما به صورت رسمی در متلب متناظری ندارد. برای نمونه در متلب هنگامی که قصد داریم به یک درایه خاص در یک ماتریس دسترسی داشته باشیم اصولا این شمارش از عدد یک شروع می‌شود. یعنی ستون اول از ماتریس A به صورت A(1,:) انتخاب می‌شود حال آن که شمارش در پایتون از صفر شروع شده و متناظر مثال متلب به صورت A[0] می‌شود. 

در ادامه به معادل دستورات متلب در پایتون (نامپای) و معادل دستورات نامپای در متلب پرداخته می‌شود. 

در رابطه با دستورات نامپای فرض شده است که با استفاده از قطه کد زیر، کتابخانه‌های لازم در کد پایتون import شده‌اند:

 
import numpy as np
from scipy import io, integrate, linalg, signal
from scipy.sparse.linalg import cg, eigs

نکته: توجه فرمایید که برخی از توابع از scipy ایمپورت شده‌اند.

برخی تفاوت‌های کلیدی

متلب

نامپای

توضیحات

help func

info(func) یا help(func)

راهنما مربوط به یک تابع (func)

which func

-

جهت یافتن محلی که تابع func تعریف شده است

type func

np.source(func) 

چاپ متن کد تابع func 

% comment

# comment

نحوه نوشتن نظر (کامنت) در کد متناظر با هر یک از زبانها

for i=1:3
    fprintf('%i\n',i)
end
for i in range(1, 4):
   print(i)

نحوه چاپ اعداد 1 الی 3 با استفاده از یک حلقه فور (به نحوه نوشتن مقادیر شروع و پایان حلقه در هر یک از زبان ها دقت کنید)

a && b

a and b

نحوه نوشتن AND

a || b

a or b

نحوه نوشتن OR

>> 4 == 4
ans = 1
>> 4 == 5
ans = 0
>>> 4 == 4
True
>>> 4 == 5
False

دستورات منطقی

a=4
if a==4
    fprintf('a = 4\n')
elseif a==5
    fprintf('a = 5\n')
end
a = 4
if a == 4:
    print('a = 4')
elif a == 5:
    print('a = 5')

استفاده از دستور if

1*i1*j1i1j

1j

نحوه نوشتن عدد مختلط

eps

np.finfo(float).eps یا

np.spacing(1)

کوچکترین مقدار فاصله بین دو مقدار عدد حقیقی double precision

load data.mat

io.loadmat('data.mat')

بارگذاری اطلاعات در فرمت دات مت

ode45

integrate.solve_ivp(f)

حل یک معادله دیفرانسیل به صورت : integrate an ODE with Runge-Kutta 4,5

ode15s

integrate.solve_ivp(f, method='BDF')

حل یک معادله دیفرانسیل به صورت : integrate an ODE with BDF method

دستورهای متناظر در جبرخطی

متلب

نامپای

توضیحات

ndims(a)

np.ndim(a) یا

a.ndim

تعداد ابعاد آرایه a

numel(a)

np.size(a) یا

a.size

تعداد المان های آرایه a

size(a)

np.shape(a) یا

a.shape

اندازه و شکل آرایه a

size(a,n)

a.shape[n-1]

تعداد المان های بعد nام آرایه a

[ 1 2 3; 4 5 6 ]

np.array([[1., 2., 3.], [4., 5., 6.]])

تعریف یک ماتریس 2 در 3

[ a b; c d ]

np.block([[a, b], [c, d]])

ساخت یک ماتریس از چهار بلوک مختلف a، b، c و d

a(end)

a[-1]

آخرین المان از a

a(2,5)

a[1, 4]

المان سطر دوم و ستون پنجم

a(2,:)

a[1] یا

a[1, :]

سطر دوم

a(1:5,:)

a[0:5] یا

a[:5] یا

a[0:5, :]

انتخاب المانهای موجود در سطرهای 1 الی 5 و همه ستونها

a(end-4:end,:)

a[-5:]

5 سطر نهایی از آرایه a

a(1:3,5:9)

a[0:3, 4:9]

انتخاب سطور اول تا سوم و ستونهای پنجم تا نهم در آرایه a

a([2,4,5],[1,3])

a[np.ix_([1, 3, 4], [0, 2])]

انتخاب المانهای محل تلاقی سطور 2، 4 و 5 و ستونهای 1 و 3

a(3:2:21,:)

a[2:21:2,:]

انتخاب سطرهای 3 الی 21 با افزایش پلکانی 2 تایی

a(1:2:end,:)

a[::2, :]

سطور فرد از آرایه a

a(end:-1:1,:) یا

flipud(a)

a[::-1,:]

معکوس کردن ترتیب سطور

a([1:end 1],:)

a[np.r_[:len(a),0]]

ماتریس a به صورتی که سطر اول آن به انتهایش چسبانده شده است.

a.'

a.transpose() یا

a.T

ترنسپوز کردن ماتریس

a'

a.conj().transpose() یا

a.conj().T

کانجوگیت ترنسپوز ماتریس

a * b

a @ b

ضرب ماتریسی

a .* b

a * b

ضرب ماتریسی به صورت المان به المان

a./b

a/b

تقسیم المان به المان ماتریسی

a.^3

a**3

به توان رساندن المان به المان ماتریسی

(a > 0.5)

(a > 0.5)

تعیین آن که کدام یک از درایه های ماتریس a بزرگتر از 0.5 هستند.

find(a > 0.5)

np.nonzero(a > 0.5)

اندیس المانهایی از a که از 0.5 بزرگتر هستند را بیاب

a(:,find(v > 0.5))

a[:,np.nonzero(v > 0.5)[0]]

پیدا کردن ستونهایی که به ازای آن بردار v از 0.5 بزرگتر است

a(:,find(v>0.5))

a[:, v.T > 0.5]

پیدا کردن ستونهایی که به ازای آن بردار v از 0.5 بزرگتر است

a(a<0.5)=0

a[a < 0.5]=0

صفر کردن هر المانی که از 0.5 کمتر باشد

a .* (a>0.5)

a * (a > 0.5)

صفر کردن هر المانی که از 0.5 کمتر باشد

a(:) = 3

a[:] = 3

همه المانها را برابر با یک مقدار خاص قرار ده

y=x

y = x.copy()

معادل مقداردهی متلب در پایتون (این مورد نیاز به تشریح نحوه مقدار دهی در پایتون دارد که در مقاله ای جداگانه بدان پرداخته خواهد شد.)

y=x(2,:)

y = x[1, :].copy()

معادل اسلایسینگ متلب در پایتون (این مورد نیاز به تشریح نحوه مقدار دهی در پایتون دارد که در مقاله ای جداگانه بدان پرداخته خواهد شد.)

y=x(:)

y = x.flatten()

تبدیل آرایه به بردار

1:10

np.arange(1., 11.) یا

 np.r_[1.:11.] یا

 np.r_[1:10:10j]

ساخت یک بردار افزایشی

0:9

np.arange(10.) یا

 np.r_[:10.] یا

 np.r_[:9:10j]

ساخت یک بردار افزایشی

[1:10]'

np.arange(1.,11.)[:, np.newaxis]

ساخت یک بردار افزایشی ستونی

zeros(3,4)

np.zeros((3, 4))

ساخت یک آرایه دو بعدی ساخته شده از صفر (فلوتینگ پوینت 64 بیت)

zeros(3,4,5)

np.zeros((3, 4, 5))

ساخت یک آرایه سه بعدی ساخته شده از صفر (فلوتینگ پوینت 64 بیت)

ones(3,4)

np.ones((3, 4))

ساخت یک آرایه دو بعدی ساخته شده از 1 (فلوتینگ پوینت 64 بیت)

eye(3)

np.eye(3)

ساخت یک ماتریس که قطر آن برابر با یک است

diag(a)

np.diag(a)

مقادیر قطر ماتریس

diag(v,0)

np.diag(v, 0)

ماتریسی مربعی که همه المان های آن صفر بوده، به جز قطر که برابر با v است

rng(42,'twister')
rand(3,4)
from numpy.random import default_rng
rng = default_rng(42)
rng.random(3, 4)

ورژن قدیمیتر: random.rand((3, 4))

یک ماتریس 3 در 4 رندم با seed برابر با 42

linspace(1,3,4)

np.linspace(1,3,4)

چهار مقدار با فاصله گذاری برابر بین اعداد 1 و 3

[x,y]=meshgrid(0:8,0:5)

np.mgrid[0:9.,0:6.] یا

 np.meshgrid(r_[0:9.],r_[0:6.])

ساخت مشگرید

 

ogrid[0:9.,0:6.] یا

 np.ix_(np.r_[0:9.],np.r_[0:6.]

the best way to eval functions on a grid

[x,y]=meshgrid([1,2,4],[2,4,5])

np.meshgrid([1,2,4],[2,4,5])

 
 

np.ix_([1,2,4],[2,4,5])

the best way to eval functions on a grid

repmat(a, m, n)

np.tile(a, (m, n))

ساخت تکراری از ماتریس a به تعداد m در راستای سطر و n در راستای ستون

[a b]

np.concatenate((a,b),1) یا

 np.hstack((a,b)) یا

 np.column_stack((a,b)) یا

np.c_[a,b]

چسباندن ماتریس b به سمت راست ماتریس a

[a; b]

np.concatenate((a,b)) یا

 np.vstack((a,b)) یا

 np.r_[a,b]

چسباندن ماتریس b به زیر ماتریس a

max(max(a))

a.max() یا

np.nanmax(a)

تعیین مقدار بزرگترین المان آرایه a

max(a)

a.max(0)

ماکزیمم هر ستون 

max(a,[],2)

a.max(1)

ماکزیمم هر سطر

max(a,b)

np.maximum(a, b)

ماکزیمم بین دو مقدار

norm(v)

np.sqrt(v @ v) یا

np.linalg.norm(v)

L2 norm of vector v

a & b

logical_and(a,b)

عملگر and به صورت المان به المان

a | b

np.logical_or(a,b)

عملگر or به صورت المان به المان

bitand(a,b)

a & b

اپراتور bitwise AND 

bitor(a,b)

a | b

اپراتور bitwise OR 

inv(a)

linalg.inv(a)

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

pinv(a)

linalg.pinv(a)

شبه-معکوس یک آرایه 2 بعدی

rank(a)

np.linalg.matrix_rank(a)

رنک ماتریس a

a\b

a مربعی:

linalg.solve(a, b) 

درغیر این صورت:

linalg.lstsq(a, b) 

راه حل معادله a x = b برای x

b/a

Solve a.T x.T = b.T instead

راه حل معادله x a = b برای x

[U,S,V]=svd(a)

U, S, Vh = linalg.svd(a); V = Vh.T

singular value decomposition of a

chol(a)

linalg.cholesky(a)

Cholesky factorization یک آرایه 2 بعدی

[V,D]=eig(a)

D,V = linalg.eig(a)

eigenvalues 𝜆 و eigenvectors 𝑣 آرایه a, که در آن 𝑎𝑣=𝜆𝑣

[V,D]=eig(a,b)

D,V = linalg.eig(a, b)

eigenvalues 𝜆 و eigenvectors 𝑣 آرایه ab که در آن 𝑎𝑣=𝜆𝑏𝑣

[V,D]=eigs(a,3)

D,V = eigs(a, k=3)

find the k=3 largest eigenvalues and eigenvectors of 2D array, a

[Q,R]=qr(a,0)

Q,R = linalg.qr(a)

QR decomposition

[L,U,P]=lu(a)

 where a==P'*L*U

P,L,U = linalg.lu(a) 

where a == P@L@U

LU decomposition with partial pivoting (note: P(MATLAB) == transpose(P(NumPy)))

conjgrad

cg

conjugate gradients solver

fft(a)

np.fft.fft(a)

تبدیل فوریه a

ifft(a)

np.fft.ifft(a)

معکوس تبدیل فوریه a

sort(a)

np.sort(a) یا

a.sort(axis=0)

مرتب سازی المانهای ستون آرایه a 

sort(a, 2)

np.sort(a, axis=1) یا

a.sort(axis=1)

مرتب سازی المانهای سطری آرایه a 

[b,I]=sortrows(a,1)

I = np.argsort(a[:, 0]); b = a[I,:]

save the array a as array b with rows sorted by the first column

x = Z\y

x = linalg.lstsq(Z, y)

رگرسیون خطی به فرم 𝑍𝑥=𝑦

decimate(x, q)

signal.resample(x, np.ceil(len(x)/q))

downsample با فیلترینگ پایین گذر

unique(a)

np.unique(a)

مقادیر منحصر به فرد در آرایه a

squeeze(a)

a.squeeze()

remove singleton dimensions of array a. Note that MATLAB will always return arrays of 2D or higher while NumPy will return arrays of 0D or higher

 

منبع

https://numpy.org

ثبت نظر:



وبسایت Vδ

وی‌دلتا، مجموعه‌ای از مقالات، آموزش‌ها و مباحث حوزه برق و برنامه‌نویسی. برای اطلاع از انتشار مقالات حتما در کانال تلگرام ما عضو شوید.

آدرس کانال تلگرام

Channel ID: @vdelta_ir

آخرین مطالب

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

آرش صمدی

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

سایر مقالات درباره نویسنده