التوجيه والبث في بايثون

نشرت: 2020-12-01

تعد Vectorization و Broadcasting طرقًا لتسريع وقت الحوسبة وتحسين استخدام الذاكرة أثناء إجراء عمليات حسابية باستخدام Numpy. هذه الأساليب ضرورية لضمان تقليل التعقيد الزمني بحيث لا تواجه الخوارزميات أي اختناقات. هذه العملية المحسّنة ضرورية لكي تكون التطبيقات قابلة للتطوير. سنستعرض هاتين التقنيتين وننفذ بعض الأمثلة.

بنهاية هذا البرنامج التعليمي ، سوف تكون على دراية بما يلي:

  • كيف يتم التعامل مع Vectorization بواسطة Numpy
  • الفروق الزمنية مع أو بدون Vectorization
  • ما هو البث
  • كيف يختلف البث عن ضرب المصفوفة المعتاد

التوجيه

نحتاج في كثير من الأحيان إلى عمليات رياضية على المصفوفات - مثل ضرب المصفوفات. الآن ، الطريقة غير المتجهية هي القيام بضرب العناصر بطريقة حكيمة باستخدام حلقة. سيؤدي تنفيذه بهذه الطريقة إلى إجراء نفس عملية الضرب عدة مرات مما قد يؤدي إلى إهدار موارد الحساب إذا كان حجم البيانات ضخمًا جدًا. دعنا نلقي نظرة سريعة.

الطريقة غير الموجهة:

استيراد عشوائي

أ = [random.randint ( 1 ، 100 ) لـ _ في النطاق ( 10000 )]
ب = [random.randint ( 1 ، 100 ) لـ _ في النطاق ( 10000 )]
٪ timeit [i * j for i، j in zip (a، b)]

#انتاج:
>> 1000 حلقة ، أفضل 3 : 658 ميكرو ثانية لكل حلقة

طريقة Vectorized:

استيراد numpy كـ np
أ = np.array ([random.randint ( 1 ، 100 ) لـ _ في النطاق ( 10000 )])
ب = np.array ([random.randint ( 1 ، 100 ) لـ _ في النطاق ( 10000 )])
٪ timeit أ * ب

#انتاج:
>> 100000 حلقة ، أفضل 3 : 7.25 s لكل حلقة

كما نرى ، انتقل الوقت المنقضي من 658 ميكروثانية إلى 7.25 ميكروثانية فقط. هذا لأنه عندما نقول a = np.array ([]) ، يتم التعامل مع جميع العمليات داخليًا بواسطة numpy. وعندما نفعل a * b ، تضرب numpy داخليًا المصفوفة الكاملة مرة واحدة عن طريق التحويل المتجه.

نستخدم هنا الأمر٪ timeit magic لتوقيت تنفيذ العملية التي قد تختلف على جهازك.

دعنا نلقي نظرة على مثال آخر للمنتجات الخارجية لمتجهين بأبعاد (nx1) و (1xm). سيكون الإخراج (nxm).

وقت الاستيراد
استيراد numpy
مجموعة الاستيراد
a = array.array ( 'i' ، [random.randint ( 1 ، 100 ) لـ _ في النطاق ( 100 )])
ب = array.array ( 'i' ، [random.randint ( 1 ، 100 ) لـ _ في النطاق ( 100 )])

T1 = time.process_time ()
ج = numpy.zeros (( 200 ، 200 ))

بالنسبة لـ i في النطاق (len (a)):
لـ j في النطاق (len (b)):
ج [i] [j] = أ [i] * ب [ي]

T2 = time.process_time ()

print ( f "وقت الحساب = { 1000 * (T2-T1)} مللي ثانية" )

#انتاج:
>> وقت الحساب = 6.819299000000001 مللي ثانية

الآن ، لنفعل ذلك مع Numpy ،

T1 = time.process_time ()
ج = numpy.outer (أ ، ب)
T2 = time.process_time ()

print ( f "وقت الحساب = { 1000 * (T2-T1)} مللي ثانية" )

#انتاج:
>> وقت الحساب = 0.2256630000001536 مللي ثانية

كما نرى مرة أخرى ، يعالج Numpy نفس العملية بطريقة أسرع عن طريق التوجيه.

يجب أن تقرأ: تطبيقات بايثون رائعة في العالم الحقيقي

البث

حتى الآن ، رأينا أمثلة حيث تم استخدام مصفوفات من نفس الحجم. ماذا لو كانت أحجام المصفوفات مختلفة؟ هذا هو المكان الذي تظهر فيه ميزة Numpy الرائعة الأخرى ، البث ، في الصورة.

البث هو امتداد آخر للتوجيه حيث لا يلزم أن تكون المصفوفات من نفس الأحجام للعمليات التي يتم إجراؤها عليها مثل الجمع والطرح والضرب وما إلى ذلك. دعونا نفهم هذا بمثال بسيط للغاية لإضافة مصفوفة وعددية.

أ = np.array ([ 1 ، 1 ، 1 ، 1 ])
أ + 5

#انتاج:
مجموعة ([ 6 ، 6 ، 6 ، 6 ])

كما نرى ، تمت إضافة العدد 5 إلى جميع العناصر. فكيف حدث ذلك؟

لتخيل العملية ، يمكنك أن تعتقد أن العدد 5 يتكرر 4 مرات لإنشاء مصفوفة تُضاف بعد ذلك إلى المصفوفة أ. لكن ضع في اعتبارك أن Numpy لا ينشئ أيًا من مثل هذه المصفوفات التي لن تشغل سوى الذاكرة. Numpy "يبث" أو يكرر العدد القياسي 5 حتى 4 أماكن لإضافته إلى المصفوفة أ.

لنأخذ مثالاً سهلاً آخر.

أ = np.ones (( 3 ، 3 ))
ب = np.ones ( 3 )
أ + ب

#انتاج:
>> مصفوفة ([[ 2. ، 2. ، 2. ] ،
[ 2. ، 2. ، 2. ] ،
[ 2. ، 2. ، 2. ]])

في المثال أعلاه ، تم بث مصفوفة الشكل (3،1) إلى (3،3) لمطابقة المصفوفة أ.

لكن هل هذا يعني أنه يمكن إذاعة أي مصفوفة بأي بعد لمطابقة مصفوفة بأي بُعد؟

رقم!

قواعد البث

يتبع Numpy مجموعة من القواعد السهلة للتأكد من بث المصفوفات التي تتبع المعايير فقط. لنلقي نظرة.

تنص قاعدة البث على أن المصفوفتين اللتين سيتم تشغيلهما يجب أن يكون لهما نفس الأبعاد أو إذا كان أحدهما 1.

دعونا نرى هذا في العمل.

مثال 1:

ضع في اعتبارك أدناه مصفوفات الأبعاد:

أ = 3 × 4 × 7

ب = 3 × 4 × 1

سيتم بث آخر بُعد ب هنا ليطابق البعد من أ إلى 7.

وبالتالي ، النتيجة = 3 × 4 × 7

المثال 2:

أ = 3 × 4 × 7

ب = 4

الآن ، عدد أبعاد a و b غير متساوٍ. في مثل هذه الحالات ، سيتم تعبئة المصفوفة التي تحتوي على عدد أقل من الأبعاد بـ 1.

لذا ، هنا ، البعد الأول والأخير لـ b هما 1 ، لذلك سيتم بثهما لمطابقة الأبعاد من a إلى 3 و 7.

وبالتالي ، النتيجة = 3 × 4 × 7.

قراءة: دروس بايثون

المثال 3:

أ = 3 × 4 × 1 × 5

ب = 3 × 1 × 7 × 1

هنا ، مرة أخرى ، سيتم بث الأبعاد الثانية والأخيرة لـ b لمطابقة الأبعاد من a إلى 4 و 5. أيضًا ، سيتم بث البعد الثالث من a ليطابق البعد b إلى 7.

وبالتالي ، النتيجة = 3 × 4 × 7 × 5

لنرى الآن عندما يفشل الشرط:

المثال 4:

أ = 3 × 4 × 7 × 5

ب = 3 × 3 × 7 × 4

هنا ، لا يتطابق البعدان الثاني والرابع لـ b مع a ولا هما 1. في هذه الحالة ، ستلقي Python خطأ في القيمة:

ValueError: لا يمكن بث المعاملات مع الأشكال ( 3 ، 4 ، 7 ، 5 ) ( 3 ، 3 ، 7 ، 4 )

المثال 5:

أ = 3 × 4 × 1 × 5

ب = 3 × 2 × 3

النتيجة: خطأ في القيمة

هنا أيضًا ، لا يتطابق البعد الثاني ولا يمثل 1 لأي ​​منهما.

قبل ان تذهب

يعتبر كل من Vectorization و Broadcasting من الأساليب التي تجعل Numpy معالجتها محسّنة وأكثر كفاءة. يجب وضع هذه المفاهيم في الاعتبار خاصة عند التعامل مع المصفوفات والمصفوفات ذات الأبعاد n ، والتي تعتبر شائعة جدًا في بيانات الصور والشبكات العصبية.

إذا كنت مهتمًا بالتعرف على Python وعلوم البيانات ، فراجع IIIT-B & upGrad's دبلوم PG في علوم البيانات الذي تم إنشاؤه للمهنيين العاملين ويقدم أكثر من 10 دراسات حالة ومشاريع ، وورش عمل عملية عملية ، وإرشاد مع خبراء الصناعة ، وجهاً لوجه مع مرشدين في هذا المجال ، وأكثر من 400 ساعة من التعلم والمساعدة في العمل مع الشركات الكبرى.

ما هو Vectorization في Python؟

Numpy عبارة عن حزمة Python توفر العديد من الوظائف الرياضية القياسية التي تتيح عمليات سريعة على مصفوفات كبيرة من البيانات دون الحاجة إلى حلقات ، بما في ذلك Vectorization. يتم استخدام Vectorization لتسريع برامج Python دون استخدام الحلقات. يمكن أن يساعد استخدام مثل هذه الطريقة في تقليل مقدار الوقت الذي يستغرقه تنفيذ التعليمات البرمجية. هناك العديد من العمليات التي يتم تنفيذها على المتجهات ، مثل حاصل الضرب النقطي للمتجهات ، والمعروف أيضًا باسم المنتج القياسي لأنه ينتج ناتجًا فرديًا ، منتجات خارجية ، مما ينتج عنه مصفوفة مربعة ذات أبعاد مساوية للطول × طول المتجهات ، الضرب حسب العنصر ، والذي ينتج عناصر بنفس الفهارس.

ما هو البث في بايثون؟

تشير كلمة البث إلى كيفية إدارة Numpy للمصفوفات ذات الأبعاد المختلفة أثناء العمليات الحسابية التي تؤدي إلى قيود محددة ؛ يتم بث المصفوفة الأصغر عبر المصفوفة الهائلة بحيث تكون أشكالها متسقة. يسمح لك البث بتوجيه عمليات المصفوفة بحيث تحدث الحلقات في لغة C بدلاً من Python ، كما يفعل Numpy. إنه يحقق ذلك دون إنشاء نسخ غير ضرورية من البيانات ، مما يؤدي إلى تنفيذ خوارزمية فعالة. في حالات معينة ، يعد البث فكرة سلبية لأنه يؤدي إلى استهلاك الذاكرة المهدر ، مما يؤدي إلى إبطاء المعالجة.

ما هي استخدامات NumPy في Python؟

NumPy أو Numerical Python هي مكتبة Python مجانية ومفتوحة المصدر مستخدمة من قبل كل فرع من فروع البحث والهندسة تقريبًا. تشتمل مكتبة NumPy على مصفوفة متعددة الأبعاد وهياكل بيانات المصفوفة وتوفر طرقًا للعمل بكفاءة على مصفوفة ، وهي كائن مصفوفة متجانسة ذات أبعاد n. يمكن للمستخدمين استخدام NumPy لتنفيذ مجموعة واسعة من العمليات الحسابية على المصفوفات. إنه يعزز Python بهياكل بيانات قوية توفر عمليات حسابية فعالة باستخدام المصفوفات والمصفوفات ، فضلاً عن مكتبة ضخمة من الوظائف الرياضية عالية المستوى التي تعمل على هذه المصفوفات والمصفوفات.