علوم وفضاء

atleast_3d: أين يذهب محور المتجه؟

متجه وصف يعطيان الشكل (1,4,1).
محور القيم هو الأوسط في المدخلين.

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

طول المحور ومكانه

تحول atleast_3d الشكل (N,) إلى (1,N,1)، والشكل (M,N) إلى (M,N,1). [1] [2]

في التنفيذ المحدد يضاف محور قبل محور المتجه وآخر بعده؛ أما المدخل الثنائي فيضاف له محور أخير. [2]

نراجع مكان القيم من الشكل والفهرس معًا. وجود ثلاثة أبعاد في الناتج لا يحدد وحده أي محور يحتوي سلسلة الأعداد التي بدأنا بها.

مثالنا يقارن المتجه بصف وعمود يحملان الأعداد نفسها. لا نختبر الحد الأدنى للرتبة مع مدخل أعلى رتبة؛ سؤالنا هو موضع المحاور في هذه التحويلات الثلاث.

القيم نفسها في ثلاثة مدخلات

شغّلنا NumPy 2.3.5 على CPython 3.12.14. القيم المؤلفة [8,-3,2,5] تختلف عن الأعداد في الأمثلة الوثائقية، وكل مدخل ndarray من int64.

كتبنا المتجه np.array([8,-3,2,5],dtype=np.int64) بالشكل (4,). كتبنا الصف np.array([[8,-3,2,5]],dtype=np.int64) بالشكل (1,4)، والعمود np.array([[8],[-3],[2],[5]],dtype=np.int64) بالشكل (4,1).

المتجه له محور واحد، والصف والعمود لهما محوران. في الصف تمتد القيم عبر أربعة أعمدة؛ في العمود تمتد عبر أربعة صفوف. لكل مدخل أربع قيم بالترتيب 8 ثم -3 ثم 2 ثم 5.

استدعينا np.atleast_3d(a) مرة لكل مدخل مستقل. لم نمرر المدخلات الثلاثة معًا، ولم نستعمل تحويل NumPy لتوليد القيم المرجعية المتوقعة.

وسط طويل أو محور أول طويل

أعطى المتجه [[[8],[-3],[2],[5]]] من int64 بالشكل (1,4,1). في هذا المثال نجد 8 عند [0,0,0]، و-3 عند [0,1,0]، و2 عند [0,2,0]، و5 عند [0,3,0].

إذن يتغير الفهرس الأوسط للوصول إلى القيم المتتابعة. لم نحصل على الشكل (1,1,4) الذي يجعل الفهرس الأخير هو المتغير بين الأعداد.

أعطى الصف القيم المتداخلة نفسها والشكل (1,4,1) من int64. صار له محور أخير طوله واحد، وبقي محور الأعمدة الذي يحمل القيم في الموضع الأوسط.

أعطى العمود [[[8]],[[-3]],[[2]],[[5]]] من int64 بالشكل (4,1,1). الفهارس هنا [0,0,0] ثم [1,0,0] ثم [2,0,0] ثم [3,0,0]؛ الفهرس الأول هو الذي يتحرك.

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

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

عمود يعطي الشكل (4,1,1).
محور القيم هو الأول في مدخل العمود.

شبكة صغيرة وحدود المقارنة

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

كتبنا الشكل المتوقع حسب مدخل كل تجربة: (1,n,1) للمتجه والصف، و(n,1,1) للعمود. لم نستعمل reshape أو إضافة محور من NumPy لإنتاج هذا المرجع.

للشبكة اخترنا أطوالًا من واحد إلى أربعة، ولكل خانة إحدى القيم -2 و0 و3. عدد قوائم القيم 3+9+27+81=120. أضفنا قائمة المثال ذات القيم خارج الشبكة فصار الإجمالي 121 حالة.

لكل حالة ثلاثة مدخلات مستقلة: المتجه والصف والعمود. مرت 121*3=363 مجموعة، مع 363 استدعاء atleast_3d. إنشاء مصفوفات المدخل لا يدخل هذا العدد.

قارنا القيم المتداخلة كاملة، وأطوال المحاور وعدد الأبعاد ونوع int64. راجعنا بقاء بايتات المدخل بعد كل استدعاء؛ يشمل السجل قائمة المثال وجميع قوائم الشبكة.

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

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

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

المدخلشكل المدخلشكل الناتج
متجه(4,)(1,4,1)
صف(1,4)(1,4,1)
عمود(4,1)(4,1,1)

للتوسع: متوسط الجدول والمحور.

المراجع

  1. NumPy atleast_3d
  2. NumPy 2.3.5 atleast_3d implementation

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