add.at تجمع الزيادات عند الفهرس المكرر. [1]
عدّ الإحالات إلى الموضع
add.at تجمع الزيادة لكل إحالة مكررة؛ += المفهرسة تختلف. [1]
نؤلف وجهتين من البداية نفسها لكي نقارن التغيير. نكتب قائمة الفهارس كما وردت، ثم نعد ظهور كل موضع فيها. العدد الذي يصف الفهرس مختلف عن عدد مرات ظهوره.
الأعداد بلا وحدة وليست قياسات. نضيف العدد نفسه في كل إحالة؛ هذا شرط المثال والبرهان التالي، ولا نستبدله بقائمة زيادات مختلفة دون مراجعة.
وجهان من بداية واحدة
أنشأنا X=np.array([-5,12,7],dtype=np.int64) وidx=np.array([2,0,2,2],dtype=np.int64)، في NumPy 2.3.5 على CPython 3.12.14. شكل X هو (3,) وشكل idx هو (4,).
أنشأنا A=np.array(X,copy=True) وB=np.array(X,copy=True). شغّلنا np.add.at(A,idx,4)، ثم B[idx]+=4. بدأت العمليتان من القيم نفسها، ولم نجعل خرج إحداهما مدخل الأخرى.
قرأنا A=[−1,12,19] وB=[−1,12,11]، بالنوع int64 والشكل (3,) في كل منهما. رجع الاستدعاء np.add.at بقيمة None؛ ليست هذه القيمة جدول النتائج الذي نضعه محل A.
الفهارس 2 و0 و2 و2 تعطي أعداد ظهور [1,0,3] للمواضع 0 و1 و2. في A، صارت −5+4=−1 في الموضع 0؛ بقيت 12 في الموضع 1؛ وصارت 7+4+4+4=19 في الموضع 2. في B، قرأنا 7+4=11 في الموضع 2.
في نموذج الشرح الموثق، القيم المؤقتة [7,−5,7,7] تصبح [11,−1,11,11] ثم تُسند. كل إحالة إلى الموضع 2 تحمل 11؛ لم نفحص المخزن الداخلي. [2]
قارنا بايتات X وidx قبل المسارين وبعدهما فكانت متطابقة. الوجهتان A وB هما اللتان تغيرتا في تجربتنا؛ لا نصف جميع المصفوفات بأنها بقيت ثابتة.
شرط اتفاق في المرجع
يعالج مرجعنا Python قائمتين مستقلتين: الأولى تزيد الخانة كل مرة يرد فهرسها؛ والثانية تزيدها مرة واحدة إذا ورد فهرسها. العدد d زيادة واحدة ثابتة لكل إحالة، وm عدد الإحالات إلى موضع بعينه.
إذا كان m=0، تبقى القيمة x في المرجعين. وإذا كان m>0، يعطي الأول x+md والثاني x+d. بطرح الثاني من الأول يكون الفرق (m−1)d. هذه حسابات بأعداد صحيحة صغيرة دون تجاوز المجال.
لذلك يتساوى المرجعان كاملين إذا وفقط إذا d=0 أو كان عدد ظهور كل موضع لا يزيد على مرة واحدة. عندما تكون d غير صفرية وm أكبر من 1، يكون الفرق غير صفر، ولو كانت قيمة البداية x نفسها صفرًا أو سالبة.
في موضع المثال 2، لدينا m=3 وd=4، فالفرق (3−1)×4=8. وهذا يطابق 19−11=8 المسجل بين الوجهتين. مجموع الزيادات في A هو 4×4=16، وفي B هو 2×4=8؛ لدينا أربع إحالات إلى موضعين مختلفين.
للتحكم، رجعنا إلى X نفسها، وغيرنا الفهارس إلى [2,0] مع زيادة 4. أعطى المساران [−1,12,11] من int64 وشكل (3,)، وأعاد add.at قيمة None. لم يتكرر فهرس في هذا التحكم.
شرط الاتفاق مبرهن داخل مرجعنا المحدد. سجلنا اتفاقه مع التشغيل في الحالات المختبرة؛ لا نجعله وعدًا لكل عملية أو نوع عددي أو قائمة زيادات.

فحوص وحدود الزيادة الثابتة
لا تضمن الفهرسة المتقدمة عمومًا ترتيب الإسناد المتكرر. [2]
مرجع الجمع المتكرر يمر على فهارس Python ويزيد عددًا صحيحًا في كل خطوة. المرجع الثاني يعد مرات الظهور ويزيد مرةً لكل موضع ذي عدد موجب. لا يستدعي أي منهما add.at أو فهرسة NumPy أو اختزال مكتبة.
عددنا قوائم الفهارس الصحيحة بطول من 0 إلى 5، وكل فهرس من {0,1,2}. العدد 1+3+9+27+81+243=364، ومنه القائمة الخالية. لكل قائمة جربنا خمس بدايات مؤلفة بطول 3 وسبع زيادات من −3 إلى 3، فلدينا 364×5×7=12740 حالة.
لكل حالة خمسة فحوص: قيم ونوع وشكل وجهة add.at ورجوع None؛ وقيم ونوع وشكل وجهة +=؛ وشرط الاتفاق مع الفرق عند كل موضع؛ وثبات بايتات X والفهارس؛ ومجموع الزيادات حسب عدد الإحالات مقابل عدد المواضع المستهدفة. أضفنا خمسة للمثال وخمسة للتحكم: 12740×5+10=63710، ومرت جميعها.
الفهارس الخالية في الشبكة لم تضف شيئًا في مرجعينا، والزيادة صفرًا لم تغير القيم. لا نجعل ذلك برهانًا على غياب إحالات متكررة في بطاقة أخرى؛ قد يتساوى الناتجان لأن الزيادة كانت صفرًا.
نقصر النتائج على int64 بطول 3، وفهارس غير سالبة وصحيحة من 0 إلى 2، وزيادة واحدة لكل إحالة. استبعدنا الزيادات المختلفة، والفهارس الخاطئة أو السالبة، والأطوال والأشكال والأنواع والخطوات الأخرى، والمصدر الفارغ والفئات المشتقة والتزامن وتجاوز المجال وNaN. لم نفحص الزمن أو حجم الذاكرة أو ضمانات ملكيتها.
احفظ البداية وقائمة الفهارس والزيادة والمسار، ثم اقرأ الوجهة بعد العملية. في هذا المثال كان تكرار عنوان واحد هو سبب الفرق العددي الذي راجعناه.
| الموضع | البداية | عدد الإحالات | add.at | += المفهرسة |
|---|---|---|---|---|
| 0 | -5 | 1 | -1 | -1 |
| 1 | 12 | 0 | 12 | 12 |
| 2 | 7 | 3 | 19 | 11 |
للتوسع: الوجهة وقيمة البداية.
المراجع
أُعدّ هذا المقال بمساعدة الذكاء الاصطناعي، وخضع لمراجعة ذاتية بالأداة نفسها. لا يُنسب إلى مراجع بشري أو خبير مستقل. منهجية المحتوى.
