في take، تدخل أبعاد مصفوفة الفهارس كاملة في شكل الناتج. [1]
شكل الفهارس لا يقرر المطابقة
في take، تدخل أبعاد مصفوفة الفهارس كاملة في شكل الناتج. [1]
تطابق take_along_axis شرائح الفهارس والبيانات على المحور المحدد. [2]
نؤلف بيانات من صفين وثلاثة أعمدة، وفهارس من صفين وعمود واحد. تساوي عدد الصفوف في المدخلين لا يجعل الدالتين تقرآن هذا الصف بوصفه عنوانًا مرتبطًا بصف البيانات بالطريقة نفسها.
نسأل عن البعد الإضافي في نتيجة take، لا عن اختيار محور آخر أو تفسير قائمة مسطحة. سنبقي axis=1 في الطلبين، ونحفظ الأعداد وشكل I نفسه بينهما. جميع الأعداد مؤلفة بلا وحدة أو معنى عن جودة صفوف فعلية.
طلبان على الفهارس نفسها
شغّلنا NumPy 2.3.5 على CPython 3.12.14. أنشأنا A=np.array([[9,-2,4],[5,7,-6]],dtype=np.int64) وI=np.array([[2],[0]],dtype=np.int64). نرقم الصفوف والأعمدة من الصفر.
نفذنا g=np.take_along_axis(A,I,axis=1). رجعت [[4],[5]] من int64 بالشكل (2,1). فهرس الصف صفر هو 2، فيختار A[0,2]=4؛ وفهرس الصف 1 هو 0، فيختار A[1,0]=5.
نفذنا t=np.take(A,I,axis=1). رجعت [[[4],[9]],[[-6],[5]]] من int64 بالشكل (2,2,1). كل صف بيانات قرأ الفهرسين 2 و 0 الموجودين في شبكة I، بدل أن يقرأ الفهرس في صفه وحده.
في صف البيانات صفر نقرأ العمود 2 ثم 0 فنحصل على 4 ثم 9. وفي صف البيانات 1 نقرأ العمود 2 ثم 0 فنحصل على −6 ثم 5. بقيت القيم في المصدر كما هي؛ الأربعة ناتجة عن تكرار طلب الشبكة على صفين.
عدد القيم في g هو 2، وفي t هو 4. لا نصف t كصفين وعمود واحد لمجرد أن I كذلك؛ نقرأ شكل النتيجة الفعلي وأدوار أبعاده قبل ربط أي رقم بصف البيانات.
تتبع الأبعاد والتحكم
في t ذي الشكل (2,2,1)، الموضع الأول يحدد صف البيانات، والثاني يحدد صف شبكة الفهارس، والثالث يحدد عمودها الوحيد. لذلك t[0,1,0]=9: نقرأ الفهرس 0 من صف I الثاني ونطبقه على صف البيانات الأول.
أما g[1,0]=5 فنتيجة مطابقة صف الفهارس الثاني بصف البيانات الثاني. تشابه رقم الصف 1 في عبارتين لا يعني أن البعد المقابل له يؤدي الدور نفسه في الناتجين.
نغير الفهارس فقط إلى J=[[1],[1]] من int64. أعطت take_along_axis على axis=1 النتيجة [[-2],[7]] بالشكل (2,1)، وأعطت take النتيجة [[[-2],[-2]],[[7],[7]]] بالشكل (2,2,1).
كل صف من شبكة J يحمل 1، فتتكرر القيمة نفسها داخل نتيجة كل صف بيانات تحت take. اتفاق قيم الاختيارات لا يزيل تكرار الطلب أو يختزل البعد الذي يمثل صف شبكة الفهارس.
بقيت بايتات البيانات والفهارس ثابتة في الحالات المختبرة، ولم يشارك الناتجان ذاكرة البيانات. اختبرنا أيضًا axis=-1 والمحور الافتراضي في take_along_axis لهذا الإصدار؛ وافقا axis=1 في أشكالنا المحددة. لا ننقل هذا الوصف إلى إصدار آخر.

مرجع وحدود
بنى مرجع Python النتيجة المطابقة من A[r][I[r][0]] لكل صف r. وبنى مرجع take شبكة لكل صف r من A[r][I[s][0]] لكل صف فهارس s، مع الإبقاء على عمود مفرد. لا يستخدم المرجع NumPy لبناء التوقع أو يستخرج الفهارس بفرز أو بحث عن قيمة عظمى.
اخترنا لكل خانة بيانات واحدة من {−1,0,2}. للخانات الست 3**6=729 مصفوفة، وللفهرسين من 0 إلى 2 توجد 3**2=9 بطاقات. المجموع 729×9=6561 حالة. أضفنا المثال والتحكم اللذين يتضمنان أعداد بيانات خارج الشبكة، فصار العدد 6563.
لكل حالة سبعة فحوص: قيم وشكل ونوع الناتج المطابق؛ قيم وشكل ونوع take؛ توافق المحور الافتراضي و −1 مع 1 في الطلب المطابق؛ توافق فهارس مكافئة سالبة نحسبها بطرح 3؛ ثبات المدخلين؛ غياب مشاركة ذاكرة البيانات؛ وعدد القيم ومراسلة مواضع شبكة take.
الإجمالي 6563×7=45941، وجميعها مرت. الفهارس المكافئة تراوحت من −3 إلى −1 وكانت صالحة على محور الأعمدة ذي الطول 3؛ لم نختبر هنا سياسة فهارس خارج النطاق أو إعادة تفسير حد اختيار.
اقتصرنا على int64 وصفين وثلاثة أعمدة وشبكة فهارس(2,1). لم نفحص البث بأشكال أخرى، أو محاور إضافية، أو الفراغ، أو out، أو فئات مشتقة، أو الكتابة إلى التخزين، أو الأداء. لا نستنتج أفضلية إحدى الدالتين لمهمة غير معلنة.
نحفظ نوع الطلب والشكل مع القيم والمواضع. إذا كان المقصود فهرسًا خاصًا بكل صف، نتحقق أن نتيجة الطلب تحقق تلك العلاقة؛ تساوي عدد صفوف المدخلين ليس وحده الدليل.
| الطلب | الشكل | عدد القيم |
|---|---|---|
| take_along_axis، axis=1 | (2,1) | 2 |
| take، axis=1 | (2,2,1) | 4 |
| take مع الفهرسين المتساويين | (2,2,1) | 4 |
للتوسع: الاختيار بحسب الصف.
المراجع
أُعدّ هذا المقال بمساعدة الذكاء الاصطناعي، وخضع لمراجعة ذاتية بالأداة نفسها. لا يُنسب إلى مراجع بشري أو خبير مستقل. منهجية المحتوى.
