علوم وفضاء

cumsum: هل النهاية تحفظ المسار؟

زيادات 5 وسالب8 وصفر و6 وسالب2؛ المجاميع 5 وسالب3 وسالب3 و3 و1. عكس الزيادات يعطي سالب2 و4 و4 وسالب4 و1؛ نهاية متساوية ومساران مختلفان.
نهاية واحدة؛ خطوات مختلفة.

cumsum تجمع تراكميًا. [1]

اقرأ المجموع مع ترتيب القيم

نؤلف x=[5,-8,0,6,-2]. القيم زيادات تعليمية موقعة بلا وحدة؛ لا تمثل أرصدة حقيقية أو قياسات جهاز. نبدأ مجموعنا من صفر، ثم نضيف كل قيمة إلى المجموع السابق ونكتب الناتج.

بعد 5 يصير المجموع 5. إضافة −8 تعطي −3؛ وإضافة صفر تبقي −3. بعد إضافة 6 يصير 3، وبعد −2 يصير 1. المجاميع الجارية هي [5,-3,-3,3,1]، وعددها خمس مثل عدد الزيادات.

القيمة الثالثة في x هي صفر، لكنها لا تجعل المجموع الثالث صفرًا؛ نضيفها إلى −3 فيبقى −3. كما أن القيمة 6 عند الموضع الرابع لا تعني أن مجموع ذلك الموضع 6؛ المجموع السابق −3 فيعطي 3.

نعكس ترتيب الزيادات إلى [-2,6,0,-8,5]. الآن المجاميع [-2,4,4,-4,1]. تتفق النهاية 1 مع المسار الأول؛ لكن مواضع المجاميع السالبة مختلفة. لا نستعيد ترتيبًا من تطابق مجموعين أخيرين.

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

احفظ البداية لاستعادة الزيادات

include_initial=True يضم صفر البداية إلى خرج cumulative_sum، ويغيّر شكله. [2]

نضع في نموذجنا الصفر قبل المجاميع الخمسة، فنكتب [0,5,-3,-3,3,1]. ست قيم هنا تصف البداية وخمس خطوات. الصفر الأول بداية أضفناها في التمثيل، وليس زيادة سادسة في x.

نطرح كل مجموع من الذي يليه: 5−0=5، ثم −3−5=−8، ثم −3−(−3)=0، ثم 3−(−3)=6، وأخيرًا 1−3=−2. نعيد بذلك [5,-8,0,6,-2] كاملة في الحساب الصحيح الدقيق.

أما فروق الجيران في [5,-3,-3,3,1] وحدها فهي [-8,0,6,-2]. لدينا أربعة انتقالات، ولذلك لا تظهر الزيادة الأولى 5 ضمنها. ليست هذه نتيجة استدعاء diff؛ إنها عمليات طرح نؤلفها ونراجعها في بايثون.

إذا كانت البداية المؤلفة 10 بدلًا من صفر، تصبح مجاميعنا [15,7,7,13,11]. فروق الجيران الداخلية تبقى [-8,0,6,-2]؛ لكن استعادة أول زيادة تتطلب 15−10. لا ننسب بداية 10 إلى include_initial، الذي يضيف صفرًا بحسب عقده.

الزيادة الأولى لا تُعرف من أول مجموع وحده إذا غابت البداية. للمجموع 15، بداية 10 تعطي زيادة 5، وبداية 12 تعطي زيادة 3. نكتب البداية صراحة بدل تخمينها من شكل جدول المجاميع.

حدد أين يبدأ التراكم من جديد

cumsum افتراضيًا مسطح؛ cumulative_sum متعدد الأبعاد يتطلب axis. [1] [2]

نؤلف A=[[5,-8,0],[6,-2,4]]. عند تراكم كل صف مستقلًا، نبدأ الأول من صفر فنحصل على [5,-3,-3]، ونبدأ الثاني من صفر فنحصل على [6,4,8]. النتيجة صفان وثلاثة أعمدة، بالشكل (2,3).

نقارن بقائمة نعلن ترتيبها صفًا فصفًا: [5,-8,0,6,-2,4]. دون إعادة البدء بين الصفين، يمر −3 من نهاية الجزء الأول إلى الجزء الثاني. نحصل على [5,-3,-3,3,1,5]، بالشكل (6,).

العدد 6 أول الصف الثاني يعطي 6 مع البداية المستقلة، ويعطي 3 مع الحمل من المجموع السابق −3. اختلاف القيمة هنا يفسره حدّ التراكم الذي اخترناه، ولا يعني تغير عدد 6 في المدخل.

نستطيع حساب الجزء الثاني مستقلًا إلى [6,4,8]، ثم إضافة مجموع الجزء الأول −3 إلى كل خانة منه، فنحصل على [3,1,5]. وصل الجزأين بهذا الحمل يعيد التراكم المتصل في المثال؛ وصل نتيجتي الصفين بلا الحمل يعطي مسارًا آخر.

ومع صفر بداية لكل صف، نمثل المسارين المستقلين بـ[0,5,-3,-3] و[0,6,4,8]، بالشكل (2,4). وجود صفرين يتبع وجود مسارين، لا وجود زيادتين صفريتين جديدتين في A. نحفظ فهرس الصف مع كل مسار حتى تبقى البداية مرتبطة به.

مع البداية صفر ثم المجاميع 5 وسالب3 وسالب3 و3 و1، أول فرق 5 ناقص صفر يعيد5. دون البداية، أول فرق سالب3 ناقص5 يعيد سالب8، فتغيب الزيادة الأولى.
نحفظ البداية مع المجاميع.

قيّد التفسير بنطاق الحساب

تجاوز سعة الصحيح يلتف، ونهاية التراكم العشري قد تختلف عن sum بسبب التقريب. [1]

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

فحصنا 1092 قائمة: كل قائمة غير خالية بطول من واحد إلى ستة، بقيم من المجموعة −2 وصفر و3. قارنا جمعًا جاريًا بجمع مستقل لكل بداية من القائمة. راجعنا الاستعادة مع الصفر، وسقوط أول زيادة بدونه، والنهاية وعكس الترتيب، وطول التمثيل مع البداية.

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

لم نشغل NumPy أو نفحص مدخلًا خاليًا أو نوعًا ثابت العرض أو out أو الذاكرة أو الزمن. نراجع عند الاستعمال نوع الحساب والمحور والبداية، ونقارن المسار كاملًا حين يكون ترتيب الزيادات جزءًا من السؤال؛ النهاية وحدها لا تكفي في مثالنا.

المسار المؤلفالبدايةالمجاميعالنهاية
x بترتيبه05، −3، −3، 3، 11
x معكوس0−2، 4، 4، −4، 11
x بترتيبه1015، 7، 7، 13، 1111

للتوسع: الأبعاد والقطر والمنقول.

المراجع

  1. NumPy — cumsum
  2. NumPy — cumulative_sum

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