على مصفوفة float64 بالقيم [113,+Inf,0] رفعت asarray_chkfinite خطأ ValueError؛ بقيت اللانهاية في الأصل. أما asarray فأعادت المصفوفة الأصلية نفسها. سنفصل قبول المدخل عن استبدال قيمه وعن إنشاء نسخة.
بوابة قبول وليست بديلًا
تحول asarray_chkfinite المدخل إلى مصفوفة، وترفع ValueError إذا احتوى NaN أو اللانهاية. [1]
نؤلف مصفوفات قصيرة، ونضع الحالة الخاصة مباشرة في موضع معلوم. الأعداد بلا وحدة قياس؛ لا ندعي أنها قراءات تحتاج إلى تصحيح، ولا نعرف عددًا كان ينبغي أن يحل محل اللانهاية.
نعلن سؤالين مستقلين: هل يرجع النداء بنجاح، وأي قيم وكائن يرجع؟ لا نضع جوابًا بديلًا في سجل الخطأ ثم نسميه نتيجة الدالة. نحتفظ بغياب العودة الناجحة عند الرفض.
نتحقق أيضًا من بقاء المصدر. ثبات بايتاته بعد المحاولة لا يعني أنه استوفى شرط القبول؛ فقد يبقى المدخل غير المحدود كما هو، ويكون النداء قد رفع خطأ.
جميع المصفوفات هنا عادية، ذات محور واحد وثلاثة عناصر. نمررها دون dtype أو order مخصصين. نفصل ما رصدناه على هذه المدخلات عن ضمانات لأي نوع أو تخطيط آخر.
المحدود ينجح واللانهاية ترفض
في NumPy 2.3.5 وCPython 3.12.14 أنشأنا a=np.array([113.0,-117.0,0.0],dtype=np.float64). الشكل (3,)، والقيم الثلاث محدودة. أعادت np.asarray_chkfinite(a) مصفوفة float64 بالقيم نفسها والشكل نفسه.
اختبار out is a أعطى True في هذا النداء؛ رجعت المصفوفة الأصلية نفسها. لا نصف هذه العودة بأنها نسخة مستقلة لمجرد أن اسم العملية يتضمن تحويلًا إلى مصفوفة.
ثم أنشأنا b=np.array([113.0,float("inf"),0.0],dtype=np.float64). استدعينا np.asarray_chkfinite(b)؛ رفعت builtins.ValueError، وحفظنا نوع الخطأ ورسالته. لم يرجع النداء مصفوفة ناجحة.
بعد الخطأ بقيت b تحمل 113 واللانهاية الموجبة والصفر. نوعها وشكلها وبايتاتها ثابتة. لم تصبح اللانهاية صفرًا أو 113، ولم يحذف النداء موضعها من الأصل.
لم نمرر عددًا بديلًا ولم نشغل عملية استبدال. هذا الفحص يبين الفرق بين نجاح المسار المحدود وفشل مسار اللانهاية على مدخلين معلنين، دون حساب سبب الحالة الخاصة أو اختيار سياسة تعويض.
الرسم يعرض المدخلين في صفين ويحفظ كلمة ValueError في صف الرفض. الفراغ الذي تركه غياب العودة لا يتحول إلى قائمة عددية مؤلفة ننسبها إلى المكتبة.
تحويل عادي وتحكم صحيح
تعرف الوثائق asarray بتحويل المدخل إلى مصفوفة؛ ولا تنشئ نسخة عندما تكون المصفوفة القائمة مطابقة للنوع والترتيب المطلوبين. [2] نراقب الهوية مباشرة في تجربتنا بدل استنتاجها من القيم المتساوية وحدها.
استدعينا np.asarray(b) على المصفوفة نفسها [113,+Inf,0] من float64. رجعت بالقيم والنوع والشكل أنفسها، وكان out is b هو True. إذن نجاح هذا النداء لم يثبت محدودية جميع العناصر.
أعدنا المقارنة على مدخلين آخرين: [113,−Inf,0] و[113,NaN,0] من float64. رفع asarray_chkfinite خطأ ValueError في كل منهما، وأعادت asarray الكائن الأصلي في كل منهما. لم نستبدل الحالة الخاصة أثناء المقارنة.
للتحكم الصحيح أنشأنا [113,−117,0] من int16. نجحت الدالتان وأعادت كل واحدة المصفوفة الأصلية نفسها، مع بقاء int16 والشكل (3,). تشابه الأعداد مع تحكم float64 لا يجعل النوعين تمثيلًا بايتيًا واحدًا.
نسجل هوية الكائن بوصفها ملاحظة من التشغيل. ليست الهوية قياسًا لاستهلاك الذاكرة الكلي أو برهانًا على عدم وجود أعمال داخلية؛ لم نقس الحمولات أو الزمن أو عدد التخصيصات.
احتفظنا ببايتات كل مدخل قبل المحاولتين وبعدهما. لم نكتب عبر المخرجات ولم نشغل قناع محدودية أو استبدالًا أو عملية حسابية. كل نتيجة في الجدول تخص النداء المحدد والمدخل المحدد.

عد النداءات وحدود المرجع
اخترنا n من113 إلى129، أي17 قيمة. لكل n خمسة مدخلات: [n,−n−4,0] من float64، ثم [n,+Inf,0] و[n,−Inf,0] و[n,NaN,0] من النوع نفسه، ثم [n,−n−4,0] من int16. المجموع17×5=85 تمثيلًا بايتيًا مختلفًا.
لكل مدخل نداء asarray_chkfinite ونداء asarray، فالمجموع85×2=170 محاولة. نجحت34 محاولة للفحص، ورفضت51 بخطأ ValueError؛ نجحت85 محاولة للتحويل العادي. صارت العودات الناجحة34+85=119، مع51 سجل خطأ منفصلًا.
كل عودة ناجحة مصفوفة من ثلاثة عناصر:119×3=357 عنصرًا من نوع عددي. بينها306 عناصر محدودة و51 حالة NaN أو لانهاية في عودات asarray. هذه أعداد عناصر سجلات العودة، وليست357 قيمة متميزة أو119 مصفوفة جديدة مخصصة.
حفظنا الأعداد المحدودة كأعداد في JSON، والحالات الخاصة كوسوم معلنة تميز NaN واللانهايتين؛ الوسوم وصف تسلسلي للقيم الفعلية وليست نصوصًا أعادتها الدالتان داخل المصفوفة. سجلات الأخطاء ليست ضمن357 عنصرًا.
يرجع math.isfinite صحيحًا عندما لا تكون القيمة لانهاية أوNaN؛ والصفر محدود. [3] استعمل المرجع هذا التعريف على أعداد Python المعلنة قبل النداءات لتحديد المتوقع، دون تشغيل فحص NumPy لتوليد التوقع.
تحقق المرجع أيضًا من بايتات المدخل بواسطة struct للنوعين المعلنين. طابقت النتائج توقع النجاح أوالخطأ، وكانت كل عودة ناجحة هي كائن المدخل، وبقيت بايتات المدخلات وأشكالها وأنواعها ثابتة. مساواة البايتات بعد النداء لا تعوض التحقق من بناء المدخل قبل النداء.
النطاق float64 وint16 ومصفوفات عادية من محور واحد بطول ثلاثة مع الإعدادات المذكورة. لم نفحص القوائم أوالمدخل المفرد أوبلا محاور أوالفئات المشتقة أوالمركب أوobject أوالزمن أوتغيير النوع والترتيب أوlike أوالنسخ أوالأداء أوإصدار آخر. قبول المحدودية لا يتحقق من وحدة العدد أومصدره أوملاءمته لمهمة واقعية.
| Own input | asarray_chkfinite | asarray |
|---|---|---|
| float64 finite | same object | same object |
| float64 +Inf | ValueError | same object |
| float64 -Inf | ValueError | same object |
| float64 NaN | ValueError | same object |
| int16 finite | same object | same object |
للتوسع: قناع المحدودية.
المراجع
أُعدّ هذا المقال بمساعدة الذكاء الاصطناعي، وخضع لمراجعة ذاتية بالأداة نفسها. لا يُنسب إلى مراجع بشري أو خبير مستقل. منهجية المحتوى.
