تقنية

einsum: هل تستخرج ii->i قطر أي مستطيل؟

مصفوفة مستطيلة ورفض طلب التسمية المكررة.
diagonal أعادت قيمتين، وeinsum رفضت مدخلنا.

في مصفوفتنا2×3، رفضت einsum العبارة ii->i، بينما أعادت diagonal قيمتي القطر. على تحكم2×2 اتفقت الدالتان؛ نراجع اختلاف الطلب والمدخل قبل الاستبدال.

التسمية المكررة والمصفوفة

تكرار التسمية في مدخل einsum يختار القطر؛ يصف التوثيق ii->i لمصفوفة مربعة. [1] diagonal تختار مواضع متساوية الفهرسين عند الإزاحة صفر. [2]

السؤال عن استبدال طلب استخراج القطر بطلب آخر يحمل الحرف نفسه مرتين. لا نناقش ترتيب الحروف المختلف أو جمع القطر إلى عدد واحد؛ الخرج الصريح هنا يبقي i.

نكتب صفوف مصفوفتنا من اليسار إلى اليمين، ونرقم الصف والعمود من الصفر. في ii->i يحمل المحوران الاسم i؛ لا نسميهما حرفين مستقلين ثم نختار ترتيبًا جديدًا للخرج.

الأعداد مؤلفة بلا وحدة، وجميع المدخلات int64. نبقي الخيارات الافتراضية للدالتين، ونفصل المدخل المستطيل عن تحكم مربع أنشأناه صراحةً.

قطر موجود وطلب مرفوض

شغّلنا NumPy2.3.5 على CPython3.12.14. المدخل A=np.array([[371,372,373],[374,375,376]],dtype=np.int64)، وشكله(2,3): صفان وثلاثة أعمدة.

نفذنا np.einsum("ii->i",A)، فرفع ValueError. سجلت رسالة هذا التشغيل اختلاف الطولين2 و3 للفهرس i داخل المدخل؛ لم يعد الطلب قائمة أعداد ناجحة.

ثم نفذنا np.diagonal(A). رجعت[371,375] من int64 بالشكل(2,). نقرأ371 من الموضع(0,0)، و375 من الموضع(1,1).

لا يوجد صف رقمه2 في A، لذلك لا يوجد فيها الموضع(2,2). العدد376 يقع في(1,2)، ولا ينتمي إلى المسار الذي تتساوى فيه إحداثيتا الصف والعمود.

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

لا نكتب[371,375] بوصفها خرج einsum المرفوض، ولا نعد الاستثناء قائمة فارغة. نفصل اسم الدالة والمدخل والاستثناء عن القيم التي رجعت من طلب آخر.

تحكم مربع من مدخل معلن

أنشأنا B=np.array([[371,372],[374,375]],dtype=np.int64) بالشكل(2,2). يحتوي الصفان أول عمودين من A، لكننا بنينا مصفوفة مستقلة بدل تغيير شكل A داخل الفحص.

أعادت np.einsum("ii->i",B) القائمة[371,375]، وأعادت np.diagonal(B) القائمة نفسها. كان النوع int64 والشكل(2,) في الطلبين.

ما زال موضع371 هو(0,0)، وموضع375 هو(1,1). لكن طول كل محور في B أصبح2؛ لا يوجد العمود الأصلي الأخير الذي حمل373 و376.

اتفاق القيم القطرية لا يعني اتفاق المدخلين: شكل A هو(2,3)، وشكل B هو(2,2)، ومجموع عناصرهما ستة مقابل أربعة. حفظ القطر لا يحفظ العناصر الأخرى.

التحكم ليس ادعاءً بأن einsum قصت A تلقائيًا. الطلب المرفوض بقي على A كاملة، والطلب الناجح استعمل B التي أعلنّاها قبل تشغيله.

إذا كانت القيم غير القطرية مهمة لمهمتك، فاحتفظ بالمدخل الأصلي. هذه المقارنة تراجع صلاحية الطلب وقيم القطر فقط؛ لا تحول B إلى بديل مكافئ لكل استعمالات A.

تحكم مربع، وطلبان يعيدان القيمتين.
التحكم مدخل جديد صريح.

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

قبل استيراد NumPy، جهز مرجع Python17 حالة لكل n من371 إلى387. كتب A=[[n,n+1,n+2],[n+3,n+4,n+5]]، وB=[[n,n+1],[n+3,n+4]].

بنى التوقع باختيار A[k][k] للفهرسين0 و1 ضمن حدود المحورين، ثم قارنه باختيار B[k][k]. القيم[n,n+4] في الحالتين؛ لم يستدع المرجع einsum أو diagonal.

لكل حالة أربعة طلبات: einsum على A، وdiagonal عليها، ثم كل دالة على B. الإجمالي68 استدعاءً:17 استثناء ValueError، و51 مصفوفة ناجحة تحتوي كل منها عددين.

عدد العناصر العددية المحفوظة51×2=102. سجلنا34 إنشاءً منفصلًا لمصفوفات المدخل، ولا تدخل هذه الإنشاءات في عدد68 طلبًا للدالتين المختبرتين.

جهز المرجع بايتات المدخلات باستخدام struct قبل الاستيراد. قارنا القيم والنوع والشكل وبقاء بايتات كل مدخل بعد الطلب؛ لم نعدل المخارج أو نفحص مشاركة الذاكرة.

اقتصرنا على int64 والشكلين(2,3) و(2,2) والأسرة المعلنة وإصدار2.3.5. لم نفحص تسميات أخرى أو عدة مدخلات أو البث والدفعات أو الإزاحات أو out أو التحسين أو أنواعًا وإصدارات أخرى أو الأداء.

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

Input shapeeinsum ii->idiagonal
A (2,3)ValueError[371,375]
B (2,2)[371,375][371,375]

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

المراجع

  1. NumPy einsum
  2. NumPy diagonal

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