علوم وفضاء

multi_dot: هل يقبل متجهًا في وسط السلسلة؟

متجه وسط سلسلة.
خطأ وحساب متتابع.

multi_dot تسمح بعامل أحادي البعد في البداية أو النهاية؛ العوامل الوسطى يجب أن تكون ثنائية الأبعاد. [1]

افحص رتبة العامل الأوسط

multi_dot تسمح بعامل أحادي البعد في البداية أو النهاية؛ العوامل الوسطى يجب أن تكون ثنائية الأبعاد. [1]

إذا كان الطرف الأول أحادي البعد يُقرأ صفًا، وإذا كان الأخير أحادي البعد يُقرأ عمودًا. [1]

شرط الرتبة يخص موضع العامل في السلسلة. لا يكفي أن تنجح عملية ثنائية سابقة على الأعداد نفسها لكي يستوفي طلب ثلاثي شروط دالة أخرى.

نثبت قائمة العوامل المطلوبة، ثم نسجل الخطأ والخرج والتحكم كلًا على حدة. لا نحول العملية إلى تعبير مختلف ونصفه بأنه نتيجة الطلب المرفوض.

حسابان متتابعان وطلب واحد

على مدخلنا A وv وw، رفعت multi_dot([A,v,w]) خطأ ValueError؛ أعادت dot(dot(A,v),w) العدد183.

تحكم بترتيب مختلف: multi_dot([v,A,w]) نجحت وأعادت181؛ هذا ليس ترتيب [A,v,w] الأصلي.

import numpy as np A=np.array([[2.,1.],[0.,3.]],dtype=np.float64) v=np.array([4.,5.],dtype=np.float64) w=np.array([6.,7.],dtype=np.float64) try: np.linalg.multi_dot([A,v,w]) except ValueError: print("ValueError") seq=np.dot(np.dot(A,v),w) ends=np.linalg.multi_dot([v,A,w])

dot مع مصفوفة ومتجه تجمع على المحور الأخير؛ ومع متجهين أحاديي البعد تعطي جداءً داخليًا وعددًا مفردًا. [2]

في المثال، A شكلها (2,2)، وكل من v وw شكله (2,). كان النوع float64، على NumPy 2.3.5 وCPython 3.12.14. العامل v في الطلب الأول يقع بالوسط وهو أحادي البعد؛ لذلك سجلنا رفضًا بدل نتيجة عددية له.

الحساب الأول يعطي Av=[2×4+1×5,0×4+3×5]=[13,15]. ثم ضرب القيم المناظرة مع w وجمعها يعطي13×6+15×7=78+105=183. كان seq من numpy.float64 بالشكل ().

أما الترتيب v,A,w، فيبدأ بجمع صف v مع أعمدة A: ‏vA=[4×2+5×0,4×1+5×3]=[8,19]. ثم8×6+19×7=48+133=181، وهو خرج ends المفرد في التشغيل.

نقل v إلى الطرف الأول غيّر التعبير الذي حسبناه. فرق181 عن183 في هذه الأعداد يجعل الفصل واضحًا؛ لا نعرض الترتيب الناجح علاجًا يحفظ الطلب الأصلي. بقيت بايتات A وv وw دون تعديل.

إضافة محور تغير تنظيم الناتج

تشكيل v عمودًا وw صفًا جعل السلسلة تعيد مصفوفة2×2 بالقيم [[78,91],[90,105]]؛ الخرج ليس العدد183.

H=np.linalg.multi_dot([A,v.reshape(2,1),w.reshape(1,2)]) E=np.linalg.multi_dot([v.reshape(1,2),A,w.reshape(2,1)])

في H، صار v بحجم2×1 في الوسط، وصار w بحجم1×2 في النهاية. ضرب A في العمود يعطي[[13],[15]]، ثم ضربه في الصف[[6,7]] يعطي[[13×6,13×7],[15×6,15×7]]، أي المصفوفة المسجلة في النقطة السابقة.

كان H من float64 بالشكل (2,2). لم نجمع خاناته الأربع إلى جواب مفرد؛ كل خانة لها صف وعمود في هذا التعبير. تطابق الأعداد الأصلية في v وw لا يجعل تنظيم العمليات متطابقًا.

في E حافظنا على ترتيب التحكم v,A,w، لكن كتبنا الطرفين صراحةً كصف1×2 وعمود2×1. أعادت E المصفوفة[[181]] من float64 بالشكل (1,1)، بينما ends أعادت عددًا مفردًا181.

إذن نسجل الأشكال مع القيم: ‏[[181]] ليست شكل العدد181، ومصفوفة H ليست شكل العدد183. هذه تحكمات معلنة بمدخلات أعيد تشكيلها؛ ليست نتيجة ناجحة للاستدعاء الذي رفض العامل الأوسط الأصلي.

تشكيل صف وعمود.
تعبيران وشكلان.

مرجع مستقل ونطاق الفحوص

مرت228 مقارنة على27 مصفوفة مثلثية صغيرة والمثال والتحكم؛ النطاق float64 وثلاثة عوامل وأشكال معلنة، دون قياس أداء أو ضمان دقة عام.

مرجعنا يستخدم جمعًا وضربًا مفهرسين بأعداد Python الصحيحة. يبني Av بجمع عنصرَي كل صف مع v، ويبني seq بجمع حاصلَي ضربه مع w، ويبني ناتج ترتيب v,A,w بجمع أربعة حدود vᵢAᵢⱼwⱼ.

لم يستخدم المرجع dot أو multi_dot أو اختزال NumPy لصنع القيم المتوقعة. الأعداد الصحيحة الصغيرة في هذه التجربة تتيح مقارنة دقيقة مع النتائج المسجلة من float64. لا ننقل ذلك إلى جميع القيم العائمة.

في الشبكة A=[[p,q],[0,r]]، حيث p من1 و2 و4، وq من0 و1 و3، وr من2 و4 و8؛ لذلك3×3×3=27 مدخلًا. أبقينا v=[4,5] وw=[6,7].

لكل مدخل ثمانية فحوص: رفض متجه الوسط؛ Av؛ قيمة seq ونوعها وشكلها؛ قيمة ends ونوعها وشكلها؛ ثبات المدخلات؛ وتحكم الطرفين ثنائيي الأبعاد. أضفنا الثمانية للمثال وأربعة لـH: ‏27×8+8+4=228.

فحوص H قارنت المصفوفة المعلنة ونوعها وشكلها، واتفاقها مع استدعاءي dot متتابعين على العمود والصف نفسيهما، وثبات A. بقيت هذه الفحوص مختلفة عن طلب dot على المتجهين الأصليين.

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

الطلبالخرجالشكل
multi_dot([A,v,w])ValueErrorلا خرج ناجح
dot(dot(A,v),w)183()
multi_dot([v,A,w])181()
طرفا v,A,w صف وعمود[[181]](1,1)
A ثم v عمود وw صف[[78,91],[90,105]](2,2)

للتوسع: أنواع المصفوفات.

المراجع

  1. NumPy multi_dot
  2. NumPy dot

أُعدّ هذا المقال بمساعدة الذكاء الاصطناعي، وخضع لمراجعة ذاتية بالأداة نفسها. لا يُنسب إلى مراجع بشري أو خبير مستقل. منهجية المحتوى.