تقنية

linalg.cross: لماذا يرفض متجهًا من مركبتين؟

مدخلان بمركبتين، وقيمة وتحذير مقابل رفض.
نفس المدخلين، وطلبان مختلفان.

على متجهينا ذوي المركبتين، رجعت cross بقيمة وتحذير، ورفضت linalg.cross الطلب. إضافة صفر ثالث صراحةً جعلت كلتيهما ترجع ثلاث مركبات؛ نراجع فرق المدخل والخرج في تشغيل محدد.

عدد المركبات في الطلب

linalg.cross تتطلب ثلاث مركبات للمتجه. [1] تقبل cross مركبتين لكن دعم المركبتين متقادم منذ2.0؛ وللمدخلين الثنائيين تعيد المركبة الثالثة وحدها. [2]

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

المصفوفة بالشكل(2,) ذات محور واحد فيه مركبتان. والمصفوفة بالشكل(3,) ذات محور واحد أيضًا، لكن فيه ثلاث مركبات. الرقم الذي نزيده في هذا المثال هو طول المحور، لا عدد المحاور.

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

قيمة وتحذير مقابل رفض

شغّلنا NumPy2.3.5 على CPython3.12.14. أنشأنا A=np.array([331,-2],dtype=np.int64) وB=np.array([3,332],dtype=np.int64). لكل مدخل الشكل(2,).

أعادت np.cross(A,B) مصفوفة int64 صفرية الأبعاد، شكلها() وقيمتها109898. وسجل الطلب تحذيرًا من فئة DeprecationWarning؛ احتفظنا به مع الخرج.

حسب مرجع Python قبل استيراد NumPy العدد331×332−(−2)×3=109892+6=109898. هذا هو العدد الذي قارناه بالخرج المفرد المسجل.

أما np.linalg.cross(A,B) فرفع ValueError. لم يسجل الطلب نتيجة عددية ناجحة، ولا نضع له القيمة109898 التي رجعت من الدالة الأخرى.

هذا ليس رفضًا من Python لكتابة قائمة أو عجزًا عن قراءة العددين: المصفوفتان أنشئتا بالفعل، لكن طول المتجه فيهما لم يحقق شرط الدالة الصارم.

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

أضف الإحداثي الثالث صراحة

أنشأنا C=np.array([331,-2,0],dtype=np.int64) وD=np.array([3,332,0],dtype=np.int64). صار شكل كل مدخل(3,)، وما زال عدد محاوره واحدًا.

أعادت np.cross(C,D) وأعادت np.linalg.cross(C,D) مصفوفة int64 بالشكل(3,) وقيمتها[0,0,109898]. لم نسجل تحذيرًا في أي من الطلبين على هذين المدخلين.

في مرجع الأعداد الصحيحة، المركبة الأولى(−2)×0−0×332=0، والثانية0×3−331×0=0، والثالثة331×332−(−2)×3=109898.

العدد109898 في خرج المدخلين الثنائيين يمثل المركبة الثالثة وحدها؛ أما الخرج الجديد فيحمل ثلاث خانات. ليست() هي(3,)، حتى لو اتفقت القيمة غير الصفرية.

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

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

إضافة صفر ثالث صراحةً، ومخرج ذو ثلاث مركبات.
تغير طول المحور وشكل الخرج، دون إضافة محور.

سجل النطاق مع النتيجة

جهز مرجع Python17 حالة قبل الاستيراد، لكل n من331 إلى347: ‏A=[n,-2] وB=[3,n+1]، ثم C=[n,-2,0] وD=[3,n+1,0]. حسب z=n×(n+1)+6 وكتب[0,0,z] للتحكم.

لكل حالة أربعة استدعاءات: cross على المركبتين، وlinalg.cross عليهما، ثم كل دالة على المدخلين ذوي الثلاث مركبات. الإجمالي68 استدعاءً؛ سجلنا51 مصفوفة عائدة و17 خطأ ValueError.

المصفوفات العائدة17 صفرية الأبعاد و34 ذات ثلاث خانات؛ عدد العناصر العددية17+34×3=119. التحذيرات17، كلها من cross على المدخلين ذوي المركبتين.

بنى المرجع بايتات68 مدخلًا مستقلًا باستخدام struct قبل الاستيراد. قارنا القيم والأشكال والنوع والبايتات؛ بقيت المدخلات كما كانت. لم ننشئ التوقع باستدعاء cross أو بحساب داخل NumPy.

اقتصر الفحص على متجهات أحادية البعد من int64، والأعداد المحددة والإصدار2.3.5. لم نفحص دفعات أو بثًا أو محورًا مختارًا أو أعدادًا عائمة أو مركبة أو تجاوز مجال النوع أو الذاكرة والأداء أو إصدارًا آخر.

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

Inputsnp.crossnp.linalg.cross
A/B two components109898; shape ()ValueError
C/D three components[0,0,109898]; shape (3,)[0,0,109898]; shape (3,)

للتوسع: تحليل المتجهات.

المراجع

  1. NumPy linalg.cross
  2. NumPy cross

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