الشريحة كلها NaN قد تمنع الفهرس. [1]
وجود الفهرس
nanargmin تختار فهرس الأصغر متجاهلة NaN؛ كلها NaN ترفع ValueError، والافتراضي مسطح. [1]
السؤال عن وجود فهرس يمكن إعادته لكل صف. لا نساوي نجاح حساب على الجدول كله بنجاح حساب مستقل داخل كل صف؛ سنجربهما على المدخل نفسه.
الأعداد أمثلة مؤلفة بلا وحدة، وليست بيانات نموذج أو جهاز. نثبت اتجاه الاختزال ونحفظ الصفوف الأصلية قبل اتخاذ قرار اختيار بعض الصفوف.
استدعاء الصفين
أنشأنا x=np.array([[7,np.nan,-2],[np.nan,np.nan,np.nan]],dtype=np.float64)، في NumPy 2.3.5 على CPython 3.12.14. شكلها (2,3): صفان وثلاثة أعمدة، مع ترقيم يبدأ من الصفر.
شغّلنا np.nanargmin(x,axis=1) داخل try، والتقطنا ValueError. لم يرجع الاستدعاء قائمة تحمل جواب الصف الأول وفهرسًا بديلًا للثاني، ولم نكتب صفرًا مكان جواب مفقود.
يحتوي الصف 0 على العددين 7 و−2 وموضع NaN. أما الصف 1 فمواضعه الثلاثة NaN؛ لا يوجد فيه عدد من قائمتنا يصلح للمقارنة التي طلبناها.
نسجل نوع الاستثناء فقط، دون اعتماد على نص رسالة بعينها بين الإصدارات. هذا تشغيل فعلي بهذا النوع والمحور والبيانات؛ لا نقدم ضمانًا لمعالجة الاستثناء في كل تطبيق.
النطاق والاختيار
استدعينا np.nanargmin(x[0]) فأعاد 2 بنوع int64 وشكل (). العمود 2 في الصف 0 يحمل −2؛ الفهرس الصحيح غير القيمة العددية التي يشير إليها.
واستدعينا np.nanargmin(x) دون محور فأعاد 2 أيضًا بالنوع والشكل نفسيهما. في القراءة المسطحة صفًا بعد صف، القيم [7,NaN,−2,NaN,NaN,NaN]؛ الموضع المسطح 2 يصل إلى الخانة نفسها في هذا المثال.
تساوي الرقمين هنا لا يجعل نجاح الاستدعاء المسطح دليلًا على وجود فهرس لكل صف. السؤال المسطح يقارن الأعداد الموجودة في المدخل كله؛ والاستدعاء الذي فشل طلب جوابًا داخل الصف كله NaN أيضًا.
isnan تعيد قناعًا منطقيًا يحدد NaN عنصرًا بعنصر. [2]
حسبنا valid=np.any(~np.isnan(x),axis=1)، وسجلنا [True,False]. في بياناتنا التي لا تضم لانهاية، هذا يعني وجود عدد محدود في الأول وغيابه في الثاني. لا نصف نفي isnan عمومًا بأنه فحص محدودية كل قيمة.
شغّلنا np.nanargmin(x[valid],axis=1). النتيجة قائمة بفهرس واحد هو 2، ونوعها int64 وشكلها (1,). وحصلنا على رقم الصف الأصلي 0 من np.flatnonzero(valid)، ثم راجعنا x[0,2] فوجدنا −2.
لم نملأ الصف الثاني ولم نستعد عددًا مجهولًا. اخترنا صفًا مختلف النطاق قبل الاستدعاء، واحتفظنا بارتباط الناتج بالصف الأصلي. بايتات x بقيت كما كانت؛ لم نختبر مشاركة الذاكرة أو جودة سياسة استبعاد.

المرجع وحدوده
عددنا كل القوائم ذات الطولين 3 و4 من الأبجدية المؤلفة [−4,1,6,NaN]. لدينا 4**3+4**4=64+256=320 قائمة؛ لكل طول قائمة واحدة كلها NaN، فيبقى 318 قائمة فيها عدد واحد على الأقل.
مرجعنا يتخطى math.isnan، ويتتبع فهرس الأصغر بالمقارنة <؛ عند التعادل يحتفظ بما سبقه. إن لم يجد عددًا يعيد علامة None داخل الفحص. [1]
المرجع تتابع Python مستقل، لا يستدعي nanargmin أو argmin أو اختزال NumPy أو min أو max في Python. None علامة في المرجع وليست ناتجًا سجلناه من استدعاء المكتبة.
لكل قائمة ثلاثة فحوص. إن وجدت أعدادًا، نقارن الفهرس ونوعه int64 وشكله () بالمرجع، ثم القيمة المختارة، ثم بايتات المدخل. وإن كانت كلها NaN، نثبت رفع ValueError، ونراجع غياب العدد في المرجع، ثم ثبات البايتات.
أضفنا ستة تحكمات للمصفوفة المعروضة: استثناء axis=1؛ وفهرس الصف الأول؛ والفهرس المسطح؛ والقناع والفهرس بعد اختيار الصف؛ وثبات الأصل؛ ورقم الصف الأصلي والقيمة المختارة. الإجمالي 320×3+6=966، ومرت جميع الفحوص.
استبعدنا اللانهاية والأنواع المركبة وغيرها، والقوائم الفارغة أو ذات عنصر واحد، والمتغيرات المفردة والمحاور الأخرى وout وkeepdims. لم نفحص بتات NaN أو الصفر أو الأداء أو تنفيذ الدالة الداخلي.
تقتصر المطابقة على القيم والأنواع المسجلة في هذا النطاق. الفهرس لا يفسر سبب الغياب، والقناع لا يقرر سياسة استبعاد مناسبة لكل بيانات؛ احتفظ بالمحور والنطاق وارتباط الصفوف عند تفسير الجواب.
| الاستدعاء على المثال | الناتج المسجل | النوع والشكل |
|---|---|---|
| nanargmin(x,axis=1) | ValueError | لا خرج |
| nanargmin(x[0]) | 2 | int64 / () |
| nanargmin(x) | 2 | int64 / () |
| nanargmin(x[valid],axis=1) | [2] | int64 / (1,) |
للتوسع: نسبة القيم المفقودة.
المراجع
أُعدّ هذا المقال بمساعدة الذكاء الاصطناعي، وخضع لمراجعة ذاتية بالأداة نفسها. لا يُنسب إلى مراجع بشري أو خبير مستقل. منهجية المحتوى.
