عند تساوي فهرسي البداية المتجاورين، reduceat تعيد عنصر البداية بدل اختزال شريحة فارغة. [1]
حد مكرر لا يعني مجموعًا صفريًا
عند تساوي فهرسي البداية المتجاورين، reduceat تعيد عنصر البداية بدل اختزال شريحة فارغة. [1]
نقرأ الفهرس موقعًا داخل قائمة البيانات، ونبدأ ترقيمه من صفر. العدد 2 في قائمة البدايات لا يطلب البحث عن قيمة تساوي 2، ولا يعلن عدد الأجزاء الذي نريده.
الشريحة المعتادة من الموضع 2 إلى ما قبل الموضع 2 خالية. جمعها في مرجع Python يعطي صفرًا. السؤال هو هل واجهة reduceat تتبع ذلك الحساب عند تكرار البداية، أم تختار حالة أخرى لهذا الزوج من الحدود.
نفصل هذا السؤال عن تقسيم البيانات إلى أجزاء متساوية أو توزيع باقي القسمة. العملية هنا تعيد عددًا لكل بداية، وليست قائمة من مصفوفات الأجزاء. نستعمل الجمع فقط، ولا نعمم النتيجة العددية على كل دالة اختزال.
تابع البدايات والقيم الثلاث
أنشأنا A=np.array([9,-2,4,7],dtype=np.int64) بالشكل (4,)، ثم نفذنا result=np.add.reduceat(A,[0,2,2],axis=0). أعادت النتيجة [7,4,11] من int64 بالشكل (3,).
البداية الأولى 0 تسبق التالية 2، فتجمع موضعي 0 و1: 9+(−2)=7. لا تدخل قيمة الموضع 2 في هذا المجموع الأول.
البداية الوسطى 2 تساوي التالية 2. في هذه الخانة أعاد التنفيذ A[2]=4. المرجع الذي يجمع A[2:2] أعطى صفرًا لأنه لم يجد عناصر في الشريحة. لا نستبدل هذا الفرق بوصف أن قيمة 4 أضيفت إلى الأصل.
البداية الأخيرة 2 تجمع حتى نهاية المدخل في مثالنا؛ تضم 4 و7، فيكون الناتج 11. لذلك يظهر العدد 4 في الخانة الوسطى، ويسهم أيضًا في الأخيرة. البدايات لا تشكل هنا تقسيمًا منفصلًا لا يتداخل.
في المقابل، قوائم الشرائح العادية هي [9,-2] ثم [] ثم [4,7]. مجاميعها [7,0,11]. مقارنة المجاميع وحدها تكشف الموضع المختلف؛ بطاقة الحدود توضح سبب الاختلاف.
غيّر الحدود وأبق البيانات
احتفظنا بـA نفسها وغيرنا قائمة البدايات إلى [0,1,2]. نفذنا الجمع على المحور نفسه، فكانت النتيجة [9,-2,11] بالشكل (3,) والنوع int64.
الحدود المتزايدة تعطي الشرائح [9] ثم [-2] ثم [4,7]. مرجع الجمع العادي أعاد [9,-2,11] أيضًا. اتفاق الحسابين في هذا التحكم لا يلغي الحالة الخاصة التي ظهرت عند تكرار الموضع 2.
في المثال ذي الحد المكرر، مجموع خانات الناتج 7+4+11=22، بينما مجموع عناصر الأصل 9−2+4+7=18. في التحكم صار المجموع 9−2+11=18. هذه حسابات لبطاقتنا المؤلفة، وليست قاعدة تقول إن مجاميع النتائج تتساوى في كل قائمة بدايات.
حفظنا بايتات A قبل كل استدعاء وبعده؛ بقيت ثابتة. فحص مشاركة الذاكرة بين المدخل والناتج أعطى False في هذه الحالات. لم ننفذ كتابة إلى النتائج أو نجرب out.
عندما نصف الناتج، نسجل قائمة البدايات كاملة، ولا نكتفي بعددها. للطلبين ثلاث خانات نتيجة، لكن الخانة الوسطى اختلفت رغم ثبات بيانات A والمحور والنوع.

فحص مستقل وحدود النطاق
بنى مرجع Python قائمة النهايات من البداية التالية لكل خانة، ومن طول المدخل للخانة الأخيرة. عندما كانت البداية أصغر من النهاية، جمع عناصر الشريحة بقوائم Python. وفي غير ذلك أخذ العنصر الموجود عند البداية.
وللمقارنة المستقلة، حسب مرجع آخر مجموع الشرائح المعتادة دون حالة العنصر المفرد. توقع اختلاف المواضع التي لا تزيد فيها البداية التالية، بشرط أن تكون قيمة عنصر البداية غير صفرية. لا يظهر فرق عددي عند عنصر يساوي صفرًا، رغم اختلاف المسار الذي وصفناه.
اخترنا أربع خانات، لكل منها إحدى القيم {−1,0,2}، فتوجد 3**4=81 قائمة بيانات. واخترنا ثلاث بدايات، لكل منها أحد الفهارس {0,1,2,3}، فتوجد 4**3=64 قائمة فهارس. الشبكة 81×64=5184 حالة، وتشمل التكرار والترتيب المتناقص.
أضفنا المثال والتحكم بالقيم [9,-2,4,7] خارج شبكة القيم، فصار العدد 5186. لكل حالة خمسة فحوص: القيم مقابل مرجع الشريحة والعنصر؛ الشكل والنوع؛ ثبات المدخل؛ غياب مشاركة الذاكرة في الناتج المسجل؛ وتحديد مواضع الاختلاف مع جمع الشرائح المعتادة.
مرت 5186×5=25930 عملية فحص. اختلف حسابا القيم في 3421 حالة من المجموع، دون اعتبار قيمة صفر دليلًا على أن الحالة الخاصة لم تقع. هذا عد لنتائج الشبكة المسجلة، لا نسبة متوقعة في بيانات واقعية.
اقتصر التنفيذ على np.add.reduceat، ومدخل أحادي من int64 بطول أربعة، وثلاث بدايات صالحة على المحور 0. لم نفحص مدخلًا أو قائمة بدايات فارغة، أو فهارس غير صالحة، أو محاور وأشكالًا أخرى، أو تجاوز مجال النوع العددي، أو out، أو دوال اختزال أخرى، أو الأداء.
| البدايات | reduceat | جمع الشرائح |
|---|---|---|
| 0،2،2 | 7،4،11 | 7،0،11 |
| 0،1،2 | 9،−2،11 | 9،−2،11 |
للتوسع: عد الفئات بالرمز.
المراجع
أُعدّ هذا المقال بمساعدة الذكاء الاصطناعي، وخضع لمراجعة ذاتية بالأداة نفسها. لا يُنسب إلى مراجع بشري أو خبير مستقل. منهجية المحتوى.
