علوم وفضاء

cumprod: هل أصفار الناتج تكشف العوامل؟

العوامل2 وصفر وسالب3 و4، والعوامل2 وصفر و7 و9، تعطي كلتاهما الخرج2 وصفر وصفر وصفر؛ الذيلان مختلفان.
خرج واحد؛ عاملان أخيران مختلفان.

cumprod تحسب الضرب التراكمي. [1]

الصفر يخفي عوامل لاحقة

نؤلف قائمة عوامل صحيحة x=[2,0,-3,4] بلا وحدة قياس. نبدأ حاصل الضرب من واحد، ثم نضربه في كل عامل ونكتب النتيجة قبل الانتقال إلى التالي. هذا حساب تعليمي دقيق في بايثون، وليس سجلًا من تشغيل NumPy.

الخطوة الأولى تعطي 1×2=2. ثم 2×0=0، وبعدها 0×(−3)=0، وأخيرًا 0×4=0. الخرج المؤلف [2,0,0,0] يضم أربع قيم تقابل أربعة عوامل، لكن القيم المتقابلة ليست متساوية دائمًا.

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

نؤلف y=[2,0,7,9]. يعطي الحساب [2,0,0,0] نفسه بالكامل، رغم اختلاف العاملين الأخيرين. حاصل ضرب ذيل x هو −12، وحاصل ضرب ذيل y هو63؛ لا نميز هذين الذيلين من الخرج التراكمي الذي حفظناه.

نستبدل صفر x بواحد في اختبار ضابط: [2,1,-3,4] تعطي [2,2,-6,-24]. تظهر آثار العاملين الأخيرين الآن. الاستبدال هنا يغير المدخل عمدًا؛ لا نقترحه إصلاحًا تلقائيًا لبيانات حقيقية.

في الحساب الصحيح الدقيق، أول صفر تراكمي يدل على أن عاملًا صفريًا دخل حتى ذلك الموضع. بعده يظل الحاصل صفرًا مهما كانت العوامل الصحيحة التالية. نحتفظ بالعوامل الأصلية إذا كان السؤال عنها، بدل محاولة قراءتها من هذه الأصفار.

الواحد لا يصلح قسمة صفر على صفر

include_initial=True يضم آحاد البداية ويغير شكل خرج cumulative_prod. [2]

نضع واحد البداية قبل الخرج المؤلف، فنكتب [1,2,0,0,0]. خمس قيم تمثل بداية وأربع خطوات؛ الواحد ليس عاملًا خامسًا دخل x، بل عنصر محايد في تمثيلنا.

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

للقائمة y، التمثيل مع البداية هو [1,2,0,0,0] أيضًا. إذن حفظ البداية لم يميز الذيلين. لا توجد قاعدة تعتمد على هذا التمثيل وحده وتستعيد x وy المختلفتين كلتيهما على نحو صحيح.

إذا كان المطلوب تفسير عوامل لاحقة، نحفظ المدخل نفسه أو سجل العوامل. وإذا حسبنا الذيل مستقلاً بعد الصفر، نحصل على مسار جديد: ذيل x=[-3,4] يعطي [-3,-12]، وذيل y=[7,9] يعطي [7,63]. هذا بدء حساب آخر، وليس استعادة الذيل من الأصفار المحفوظة.

حدد حدّ التراكم

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

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

نقارن بقائمة نعلن ترتيبها صفًا فصفًا: [2,0,-3,4,5,6]. إذا لم نعد البدء بين الصفين، تبقى النتيجة [2,0,0,0,0,0] بالشكل (6,). العامل4 يتلقى حاصلًا سابقًا صفريًا هنا، فيعطي صفرًا بدل4.

نراجع الحمل بضرب كل قيمة من نتيجة الصف الثاني [4,20,120] في حاصل الصف الأول الأخير، وهو صفر. نحصل على [0,0,0]، وهو جزء الخرج المتصل الأخير. الاحتفاظ بالصفوف مستقلّة والمرور في مسار متصل يجيبان عن سؤالين مختلفين.

مع واحد بداية لكل صف، نمثل النتيجتين بـ[1,2,0,0] و[1,4,20,120]، بالشكل (2,4). آحاد البداية ليست رصدين جديدين في A. نكتب حدّ كل مسار حتى لا ننسب أصفار مسار متصل إلى عوامل صف مستقل.

التمثيل1 و2 وصفر وصفر وصفر؛ القسمة2 على1 تعيد2 والقسمةصفر على2 تعيدصفر؛ القسمةصفر علىصفر غير معرفة ولا تستعيد الذيل.
واحد البداية لا يكشف الذيل.

افصل الصحيح الدقيق عن الالتفاف

الحساب الصحيح ذو السعة المحدودة يلتف عند التجاوز. [1]

نتائجنا السابقة تستخدم أعداد بايثون الصحيحة الدقيقة. ولتوضيح حدّ الاستدلال، نؤلف نموذجًا آخر صراحة: بعد كل ضرب نحتفظ بباقي القسمة على256. للعاملين [16,16] نحفظ16 أولًا، ثم 256 بباقٍ صفر. كلا العاملين غير صفري، ومع ذلك يظهر صفر في الخرج المخزن.

هذا نموذج حساب محدد، وليس نتيجة تشغيل NumPy على مدخل uint8 أو حكمًا على نوع المراكم الافتراضي. لا نستنتج منه أن إدخال uint8 وحده يفرض هذا الالتفاف. كما لا نستعمله لإثبات سلوك عشري أو NaN أو اللانهاية أو الانخفاض العددي إلى الصفر.

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

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

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

العوامل المؤلفةالخرج التراكميحاصل الذيل
2، 0، −3، 42، 0، 0، 0−12
2، 0، 7، 92، 0، 0، 063
2، 1، −3، 42، 2، −6، −24−12

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

المراجع

  1. NumPy — cumprod
  2. NumPy — cumulative_prod

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