وبلاگ رسانگار
با ما حرفه ای باشید

سرور مجازی NVMe

ماتریس Numpy و ضرب برداری

0 25
زمان لازم برای مطالعه: 3 دقیقه


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

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

ساختار داده پایه NumPy عبارت است از آرایه N بعدی، به درستی نامگذاری شده است ndarray. اشیاء در ndarray باید یک نوع داشته باشند و آرایه ها اندازه ثابتی دارند (به دلیل تخصیص حافظه کد C زیرین). وقتی اندازه an را تغییر می دهید ndarray، Numpy در واقع آرایه اصلی را حذف می کند و یک آرایه جدید ایجاد می کند.

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

ضرب ماتریس و برداری در NumPy

به منظور بهره برداری کامل از قابلیت های NumPy، کد ما باید به صورت برداری نوشته شود – یعنی در صورت امکان، حلقه ها را با عملیات Numpy جایگزین کنیم. یکی از بلوک های اساسی برای انجام این کار ضرب ماتریس است.

یادآوری جبر خطی، با توجه به یک ماتریس a با شکل (i,j) و یک ماتریس b با شکل (j,k)، a.dot(b) یک ماتریس با شکل خروجی خواهد داد (i,k).

ضرب برداری به حالتی کاهش می یابد که i==1 و k == 1. در اینجا مثالی از ضرب ماتریس آورده شده است:

import numpy as np
a = np.ones((3,4))
b = np.ones((4,5))
c = a.dot(b)

print(c.shape)
print(c)
(3, 5)
((4. 4. 4. 4. 4.)
 (4. 4. 4. 4. 4.)
 (4. 4. 4. 4. 4.))

و در اینجا یک مثال از ضرب برداری است:

a = np.ones((1,4))
b = np.ones((4,1))
c = a.dot(b)

print(c.shape)
print(c)
(1, 1)
((4.))

ضرب ماتریس بردار NumPy

یکی از ضد الگوهای رایج هنگام کار با Numpy تکرار روی ردیف های یک است ndarray با استفاده از حلقه های پایتون این کار کد شما را کند می کند، زیرا از اجرای کل منطق در کد C بهینه شده خود جلوگیری می کند.

به عنوان مثال، فرض کنید شما یک سبدی از سه محصول با نرخ سود 10%، 20% و 30% دارید و همچنین یک آرایه با درآمد روزانه برای هر محصول دارید. شما می خواهید سود کل را محاسبه کنید. یکی از راه های (بد) برای این خواهد بود:

profit_rate = np.array((0.1, 0.2, 0.3))
daily_revenues = np.array(((3,4,5,6),(9,7,5,3),(1,2,3,4)))

total_profit = 0
for i, revenue in enumerate(daily_revenues):
   total_profit += + np.sum(revenue*profit_rate(i))

print(total_profit)
9.600000000000001

بهتر است کد خود را برداریم و همه چیز را با استفاده از ضرب برداری/ماتریس و توابع NumPy بنویسیم:

profit_rate = np.array((0.1, 0.2, 0.3))
daily_revenues = np.array(((3,4,5,6),(9,7,5,3),(1,2,3,4)))

print(np.sum(profit_rate.dot(daily_revenues)))
9.600000000000001

این چقدر تفاوت دارد؟

profit_rate = np.array((0.1, 0.2, 0.3))
daily_revenues = np.array(((3,4,5,6),(9,7,5,3),(1,2,3,4)))

def get_profit(profit_rate, daily_revenues):
    total_profit = 0
    for i, revenue in enumerate(daily_revenues):
        total_profit += np.sum(revenue*profit_rate(i))

    return total_profit

def get_profit_vectorized(profit_rate, daily_revenues):
    return np.sum(profit_rate.dot(daily_revenues))
%timeit get_profit(profit_rate, daily_revenues)
20 µs ± 1.49 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
%timeit get_profit_vectorized(profit_rate, daily_revenues)
4.37 µs ± 22 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

در هنگام استفاده از عملیات بردار، حدود 5 برابر سریعتر!

(برچسب‌ها به ترجمه)# python



منتشر شده در 1403-01-02 12:22:11

امتیاز شما به این مطلب
دیدگاه شما در خصوص مطلب چیست ؟

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

لطفا دیدگاه خود را با احترام به دیدگاه های دیگران و با توجه به محتوای مطلب درج کنید