علوم وفضاء

piecewise: هل يحفظ المدخل الصحيح نصفًا؟

ناتجان لنوعين.
أعداد المثال نفسها؛ يختلف النصف.

أعادت الدالة نصفًا، لكن خرج مثالنا الصحيح لم يحتفظ به.

افحص المدخل قبل توقع نوع الناتج

تعيد piecewise ناتجًا بالشكل والنوع نفسيهما للمدخل، وتقيم الدوال حيث تتحقق شروطها. [1]

قد نكتب دالة تعيد نصف العدد، ثم نتوقع أن كل مصفوفة تستعملها ستحتفظ بأنصاف الأعداد. سؤالنا هنا عن المصفوفة التي تعيدها piecewise، وعن نوع مدخلها المعلن؛ لا نكتفي بالنظر إلى صيغة الدالة.

نختار الأعداد نفسها في مدخلين: أحدهما int64 والآخر float64. نستعمل شرطًا للأعداد السالبة وشرطًا للأعداد الأكبر من اثنين، ونترك العدد واحدًا خارج الشرطين. لا يوجد تداخل في هذه القواعد.

الأعداد مؤلفة للتعليم ولا تحمل وحدات قياس. نراجع القيم والنوع والشكل في سطور منفصلة، بحيث لا تتحول كتابة العدد دون نقطة عشرية إلى اختبار بديل عن dtype.

الدالة نفسها وناتجان مختلفان

شغّلنا NumPy 2.3.5 على CPython 3.12.14. أنشأنا x=np.array([-3,1,4],dtype=np.int64)، وأنشأنا f=np.array([-3,1,4],dtype=np.float64) بصورة مستقلة. شكل المدخلين (3,).

لكل مدخل نعيد بناء شرطَيه منه: x<0 وx>2، أو f<0 وf>2. قائمة الدوال في الحالين [lambda t:t/2,lambda t:t/2]. لا نعيد ترتيب الأعداد أو نغير العملية الحسابية بين المسارين.

استدعينا np.piecewise(x,[x<0,x>2],[lambda t:t/2,lambda t:t/2]). كانت القيم [-1,0,2]، والنوع int64، والشكل (3,). عند العدد -3 لم يحتفظ الناتج بالنصف الموجود في -1.5.

استدعينا الصيغة نفسها مع f وشروطه. كانت القيم [-1.5,0.0,2.0]، والنوع float64، والشكل (3,). العدد أربعة أعطى اثنين في المسارين؛ هذا الاتفاق في خانة واحدة لا يثبت تساوي النتيجتين.

القسمة العنصرية تكافئ استعمال / على المصفوفة. [2] شغّلنا x[x<0]/2 مباشرة فكانت [-1.5] من float64. فالنصف ظهر في تحكم القسمة؛ لكنه لم يظهر في خانة خرج piecewise الصحيح في المثال نفسه.

لا نصف -1 بأنه التقريب للأقرب لعدد -1.5؛ نعرض قيمة التخزين التي سجلناها ونقارنها بمرجع اتجاهه نحو الصفر ضمن هذا النطاق. بقيت بايتات المدخلين وأقنعة شروطهما دون تغيير.

راجع الخانة غير المطابقة منفصلة

الموضع الذي لا تغطيه الشروط يأخذ صفرًا، ويمكن إضافة بديل أخير. [1]

العدد واحد لا يحقق كونه سالبًا، ولا يحقق كونه أكبر من اثنين. لذلك لم نقارن صفره بعملية 1/2: هذه الخانة لا تستدعي دالتَي النصف في القواعد التي اخترناها.

أضفنا العدد المفرد 9 عنصرًا ثالثًا إلى قائمة الدوال، مع بقاء الشرطين كما هما. أعطى المسار الصحيح [-1,9,2]، وأعطى المسار العائم [-1.5,9.0,2.0]. تغيرت الخانة الوسطى وحدها في المثال.

إضافة البديل لم تجعل المسار الصحيح يحتفظ بالنصف في الخانة الأولى. ونقل المدخل إلى float64 في مثالنا لم يجعل الخانة غير المطابقة تستدعي دالة النصف. سؤال نوع التخزين وسؤال تغطية الشروط يحتاجان إلى فحصين منفصلين.

تظهر الصورة الداخلية العدد -3 أولًا، ثم نتيجة القسمة -1.5، ثم القيمتين المخزنتين -1 و-1.5 في المسارين. أما واحد فيظهر خارج القناعين، مع بديله صفرًا أو تسعة. هذه أرقام التشغيل المعلن، وليست مخرجات مفترضة من اسم الأداة.

القسمة ثم الناتج.
البديل في خانة أخرى.

مرجع كسري ونطاق محدود

أنشأنا كل قائمة بطول من واحد إلى ثلاثة من الأعداد -3 و-2 و0 و1 و3 و4. عدد القوائم 6+36+216=258. لكل قائمة اختبرنا غياب البديل وإضافة العدد 9، فأصبح عدد حالات الشبكة 516.

بنى المرجع توقعًا باستخدام Fraction في Python: إذا كان العدد سالبًا أو أكبر من اثنين، فقيمته المرجعية n/2؛ وإلا فالقيمة صفر أو تسعة حسب الحالة. لم يستدعِ المرجع piecewise أو تحويل نوع من NumPy لبناء هذا التوقع.

للمسار الصحيح أخذ المرجع إشارة البسط مضروبة في حاصل abs(البسط)//المقام. هكذا توقع -1 للنصف السالب -3/2، و1 للنصف 3/2. للمسار العائم قارنّا النسبة الدقيقة لكل عدد ناتج بالكسر المرجعي؛ الأعداد المختارة أنصاف صغيرة دقيقة.

راجعنا ستة أشياء في كل حالة: القيم الصحيحة؛ ونوعها وشكلها؛ والقيم العائمة ككسور دقيقة؛ ونوعها وشكلها؛ وثبات بايتات المدخلين والأقنعة؛ وقسمة الجزء السالب مباشرة مقابل مرجع النصف.

أضفنا حالتي المثال [-3,1,4]، مع البديل وبدونه، بالفحوص الستة نفسها. صار الإجمالي (516+2)×6=3108، ومرت جميعها. عدد الفحوص يصف النطاق المنفذ؛ لا يثبت سلوك كل مدخل ممكن.

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

المسارالناتجالنوع
بدون بديل / x[-1,0,2]int64
بدون بديل / f[-1.5,0.0,2.0]float64
بديل 9 / x[-1,9,2]int64
بديل 9 / f[-1.5,9.0,2.0]float64

للتوسع: غلاف vectorize.

المراجع

  1. NumPy 2.3 — piecewise
  2. NumPy 2.3 — divide

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