True في هذا المثال لا يثبت تماثل موضع NaN في الجزأين.
ما الذي قبلته المقارنة؟
مع equal_nan، يكفي NaN في أي جزء لدى الطرفين؛ لا يلزم تماثل موضعه. [1]
هنا نختار سؤالين مختلفين ونحفظ نتيجة كل منهما. الأول نتيجة الاستدعاء على العنصر المركب كله، والثاني تحكم اخترناه يقارن الجزأين منفصلين. لا نسمي الشرط الثاني تعريفًا بديلًا تفرضه المكتبة على الاستدعاء الأول.
نكتب العدد المركب في هذا المقال على صورة زوج (الحقيقي، التخيلي). الزوج (4,NaN) يعني أن الإحداثي الحقيقي 4 والتخيلي NaN؛ أما (NaN,−7) فيضع NaN في الحقيقي. لا نكتب هذه الأزواج كأنها أعداد مركبة محدودة ذات مساواة حسابية مألوفة.
نتعامل مع قيم بلا وحدة. لا نعرف أصل القيمة المفقودة، ولا نقرر أنها آمنة للحساب التالي. الغرض هو قراءة معيار المقارنة الذي اخترناه من خلال مثال يمكن إعادة تشغيله.
زوجان متعاكسان في موضع NaN
شغّلنا NumPy 2.3.5 على CPython 3.12.14. أنشأنا nan=float("nan")، ثم A=np.array([complex(4,nan),complex(2,-3)],dtype=np.complex128) وB=np.array([complex(nan,-7),complex(2,-3)],dtype=np.complex128).
استخدمنا الباني complex(real,imag) مباشرةً لكل عنصر. لم نؤلف الإحداثي بواسطة ضرب NaN في الوحدة التخيلية أو جمعه؛ حفظنا الزوجين المقصودين في سجل الفحص قبل المقارنة. سجل JSON يستخدم النص "NaN" لوسم الإحداثي المفقود، لا عددًا غير قياسي في JSON.
شكل كل مصفوفة (2,). رجع np.array_equal(A,B) بقيمة False، ورجع np.array_equal(A,B,equal_nan=True) بقيمة True. كانت القيمتان من نوع bool في التشغيل الفعلي.
يعطي isnan قناعًا منطقيًا عنصرًا عنصرًا. [2]
قرأنا np.isnan(A) وnp.isnan(B) بقناع [True,False] لكل منهما. هذه نتيجة فعلية على complex128 في مثالنا؛ القناع هنا لا يسجل هل وقع NaN في الحقيقي أم التخيلي.
حسبنا np.array_equal(A.real,B.real,equal_nan=True)، فرجع False. وحسبنا الاستدعاء نفسه على A.imag وB.imag، فرجع False. جمعنا الشرطين بواسطة and فكان False.
في الحقيقي، الأول 4 مقابل NaN. وفي التخيلي، الأول NaN مقابل −7. أما العنصر الثاني فإحداثياه (2,−3) في الطرفين. تسجل البطاقة True على مستوى المصفوفتين المركبتين وFalse لتحكم الجزأين؛ لا نبدل إحدى النتيجتين بالأخرى.
قارنا بايتات A وB قبل الفحوص وبعدها فبقيت ثابتة. لم نجر كتابة إلى العناصر، ولا نجعل هذا الفحص بيانًا عن ملكية الذاكرة أو سلوك عمليات أخرى.
تحكمان وقيد الشكل
في التحكم الأول أبقينا A، وغيرنا العنصر الثاني في B إلى complex(2,-4). بقي أول B هو complex(nan,-7)، والنوع complex128 والشكل (2,). رجع الاستدعاء الافتراضي False، ومع equal_nan=True رجع False أيضًا.
بقي قناعا isnan في التحكم الأول [True,False]. لذلك لا يكفي تطابق القناعين للحكم بقبول المقارنة في أمثلتنا. الإحداثي التخيلي المحدود للعنصر الثاني −3 مقابل −4 اختلف؛ سجلنا رفض المقارنة رغم بقاء موضعي القناع كما هما.
في التحكم الثاني أعدنا العنصر الثاني في B إلى complex(2,-3)، وجعلنا أول A هو complex(4,-7). صار أول A بلا NaN، بينما بقي أول B هو complex(nan,-7). رجع الاستدعاء الافتراضي False، ومع equal_nan=True رجع False.
قناع A في التحكم الثاني [False,False] وقناع B هو [True,False]. المقارنة المنفصلة للحقيقي False، وللتخيلي True، واجتماعهما False. هذه بطاقة مختلفة عن المثال الأول الذي وضع NaN في كلا العنصرين الأولين، وإن اختلف الجزء الحامل له.
يشترط array_equal تماثل الشكل. [1]
أعدنا تشكيل B إلى (1,2) مع إبقاء A بالشكل (2,). في المثال والتحكمين، رجع array_equal مع equal_nan=True بقيمة False. لم نستخدم allclose أو isclose في هذه الفحوص.
تذكر البطاقة أي عنصر تغير وأي شكل استُخدم وأي خيار فُعّل. عبارة «القناعان متطابقان» أو «عدد القيم متساوٍ» لا تحمل وحدها جميع تفاصيل التجربة التي سجلناها.

مرجع الإحداثيات وحدود الشبكة
بنينا مرجع Python من أزواج إحداثيات موسومة. يحتفظ كل زوج بعددين صغيرين أو الوسم النصي NaN. لا يستدعي المرجع مقارنة NumPy، ولا يستخدم حسابًا مركبًا كي يستنتج موضع القيمة المفقودة.
مرجعنا يقبل إحداثيات محدودة متساوية؛ ومع equal_nan يقبل أيضًا عنصرين يحمل كلاهما NaN. قابلناه بالتشغيل. [1]
التحكم المنفصل يقبل كل إحداثي إذا تساوت قيمتاه المحدودتان أو حمل الطرفان الوسم في الإحداثي نفسه. ثم يشترط قبول الحقيقي والتخيلي معًا. اخترنا هذا التحكم لكي يكشف فرق الموضع؛ لا نجعله حكمًا عامًا على ملاءمة البيانات.
اخترنا لكل إحداثي أحد القيم {−2,0,3,NaN}. لدينا 4×4=16 حالة لعنصر مركب، و16×16=256 متجهًا ذا عنصرين. عدد أزواج المتجهات المرتبة 256×256=65536؛ نعني زوجًا مرتبًا من مصفوفتين، لا زوج الإحداثيات داخل عنصر.
لكل حالة ستة فحوص: النتيجة الافتراضية مقابل المرجع؛ ونتيجة equal_nan مقابل مرجعه؛ والقناعان المنطقيان؛ وتحكم الجزأين المنفصلين؛ ورفض الشكل المختلف (1,2)؛ وثبات بايتات المدخلين مع نوعهما وشكلهما ونوع النتائج. أضفنا ستة فحوص لكل من المثال وتحكميه، فصار المجموع 65536×6+18=393234، ومرت جميعها.
قيم الإحداثيات المحدودة في الشبكة صغيرة وصحيحة. لا تشمل الفحوص اللانهاية أو أعدادًا محدودة كبيرة أو تسامحًا عدديًا أو أشكالًا وأنواعًا وأطوالًا أخرى أو المدخل الفارغ أو الفئات المشتقة والخطوات المختلفة.
لم نفحص الإشارات الخاصة بالصفر، أو تفاصيل NaN وحمولته وأصله، أو استدعاء المصفوفة مع نفسها كحالة مستقلة. لم نفحص الأداء أو ملكية الذاكرة أو تنفيذ المكتبة الداخلي. المرجع وسيلة لمقابلة النتائج ضمن النطاق المعلن.
إذا كانت مهمتك تتطلب معرفة الإحداثي الذي يحمل NaN، فاحفظ اختبار ذلك الإحداثي ونتيجته صراحةً في سجل المهمة. True في المثال الأول لا يعيد القيمة المفقودة، ولا يثبت تطابق موضعها، ولا يكفي وحده لقبول بيانات واقعية.
| البطاقة | equal_nan=True | قناع A | قناع B | تحكم الجزأين |
|---|---|---|---|---|
| المثال | True | [True,False] | [True,False] | False |
| تغيير المحدود | False | [True,False] | [True,False] | False |
| NaN في طرف واحد | False | [False,False] | [True,False] | False |
للتوسع: قناع القيم المحدودة والمفقودة.
المراجع
أُعدّ هذا المقال بمساعدة الذكاء الاصطناعي، وخضع لمراجعة ذاتية بالأداة نفسها. لا يُنسب إلى مراجع بشري أو خبير مستقل. منهجية المحتوى.
