علوم وفضاء

unique: هل يجمع equal_nan الصفوف التي تحمل NaN؟

مدخل أربعة صفوف، وخرج ثلاثة صفوف بتكرارات اثنين وواحد وواحد.
لم يندمج صفا NaN في الطلب المحوري المسجل.

unique تعمل على الأجزاء التي يحددها المحور؛ وبدون محور تسطح المدخل. [1]

قيمة مفردة أم صف كامل؟

unique تعمل على الأجزاء التي يحددها المحور؛ وبدون محور تسطح المدخل. [1]

نسمي المحور 0 محور الصفوف في جدولنا، والمحور 1 محور الأعمدة. نريد أولًا حصيلة الصفوف كاملةً، ثم حصيلة القيم المفردة في الجدول كله. لا نعد تغيير وحدة العد مجرد تغيير لشكل العرض؛ الصف يحوي ثلاثة عناصر مرتبطة في طلبنا الأول.

نضع NaN مباشرةً في المدخل، دون توليده بقسمة أو عملية أخرى. هو وسم في تجربتنا، وليس قصة عن سبب غياب مشاهدة أو دليلًا على هوية سجل واقعي. في JSON نسجله بالنص "NaN" كي لا نكتب عددًا غير قياسي في الملف.

السؤال محدد: هل يدمج الخيار equal_nan=True الصفين اللذين يحملان العددين المحدودين نفسيهما وNaN في العمود نفسه؟ نحفظ الإصدار والنوع والمحور مع الجواب، ولا ننقل سلوك قيمة مفردة تلقائيًا إلى صف متعدد الأعمدة.

ثلاثة صفوف وأربع قيم

على NumPy 2.3.5 وCPython 3.12.14 أنشأنا A=np.array([[2,np.nan,7],[2,np.nan,7],[2,5,7],[2,5,7]],dtype=np.float64). الشكل (4,3)، والأعداد مؤلفة بلا وحدة قياس. كل من الصف ذي NaN والصف المحدود يظهر مرتين في المدخل.

نفذنا u,c=np.unique(A,axis=0,equal_nan=True,return_counts=True). كانت الصفوف المسجلة [[2,5,7],[2,NaN,7],[2,NaN,7]]، والتكرارات [2,1,1]. شكل u هو (3,3)، ومجموع التكرارات 4 يوافق عدد الصفوف الأصلية. بقي الصفان الحاملان لـNaN منفصلين في هذا الخرج.

ثم نفذنا f,fc=np.unique(A,equal_nan=True,return_counts=True) دون محور. القيم المسجلة [2,5,7,NaN]، والتكرارات [4,2,4,2]. العدد 2 يظهر أربع مرات، و5 مرتين، و7 أربعًا، وNaN مرتين؛ المجموع 12 يوافق عدد خانات الجدول، وليس أربعة صفوف.

في التنفيذ المقروء، يحول مسار المحور الأجزاء إلى سجلات حقول؛ وفرع دمج NaN يختبر أنواعًا محددة. [2]

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

خيار معطل وتحكم محدود

أعدنا طلب الصفوف على A مع equal_nan=False وreturn_counts=True. في المثال رجعت الصفوف الثلاثة نفسها والتكرارات [2,1,1]. لذلك تشغيل الخيار أو تعطيله لم يغير حصيلة هذه الصفوف؛ لا نستنتج من ذلك أنه بلا أثر في كل طلب، فقد سجلنا دمج NaN في الطلب المسطح مع True.

لتحكم منفصل أنشأنا C=[[2,5,7],[2,5,7],[2,5,7],[2,5,7]] من float64. طلب unique مع axis=0 وequal_nan=True أعاد [[2,5,7]] وتكراره [4]. هنا أربعة صفوف محدودة متساوية، بينما يحتوي A على صفين محدودين وصفين ذوي NaN.

هذا تغيير في القيم، لا إصلاح مؤكد لبيانات مفقودة. اخترنا العدد 5 داخل التحكم لكي نصنع صفوفًا محدودة متساوية؛ لا نعرف قيمة مجهولة استعدناها، ولا نقترح ملء عمود واقعي به.

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

حصيلة A مع True وFalse، وحصيلة تحكم C المحدودة.
التحكم يغير القيم؛ لا يستعيد مشاهدة مجهولة.

مرجع موسوم ونطاق الفحوص

لكل ثلاثية p وq وr بنى المرجع مدخلًا بصفين [p,NaN,r] وصفين [p,q,r]. أنشأ حصيلة متوقعة يكون فيها كل صف يحمل NaN منفصلًا، والصف المحدود بتكرار اثنين. هذا مرجع للسلوك الذي قابلناه في الإصدار والنطاق، وليس تعريفًا عامًا لمساواة المعلومات المفقودة.

مثل المرجع NaN بوسم نصي، والأعداد المحدودة بأعداد Python. قارن حصائل صف وتكراره دون الاعتماد على ترتيب الصفين الموسومين المتعادلين في العرض. لا يستدعي unique أو فرز NumPy أو مقارنة NumPy في بناء التوقع.

للحصيلة المسطحة، مر على الخانات الاثنتي عشرة وعد كل قيمة في قاموس، وجمع ظهورَي الوسم في خانة واحدة. هذا طلب مرجعي آخر؛ إذا اتفقت p أو q أو r في الشبكة، جمع تكرارات قيمها أيضًا بدل افتراض أربع قيم مختلفة دائمًا.

اخترنا p وq وr من {−2,0,3}؛ يوجد 3³=27 ثلاثية. أضفنا المثال (2,5,7) منفصلًا، فجميع قيمه خارج أبجدية الشبكة. كل مدخل أربعة صفوف وثلاثة أعمدة، وموضعا NaN ثابتان في العمود الأوسط للصفين الأولين.

لكل مدخل عشرة فحوص: حصيلة الصفوف، وعددها وشكلها، ومجموع تكراراتها، وحصيلة التسطيح، ومجموع تكراراته، وعدد NaN وتكراره فيه، والتحكم المحدود، وحصيلة الصفوف مع False، وثبات بايتات المدخل ونوع المخارج، وتكرار كل صف موسوم مقابل الصف المحدود. مرت 28×10=280 فحصًا.

النطاق float64 متصل بأعداد محدودة صغيرة وموضعَي NaN معلنين. لا يشمل مواضع غياب أخرى أو اللانهاية أو الأعداد المركبة أو object أو إشارات الصفر أو axis=1 أو المدخل الفارغ أو return_inverse أو sorted=False أو الأداء. لا نستخرج سياسة تنظيف أو ضمانًا لإصدار آخر من عدد الفحوص.

الطلبوحدة العدالتكرارات في المثال
A مع axis=0 وTrueصف كامل2، 1، 1
A دون محور وTrueقيمة مفردة4، 2، 4، 2
C المحدودة مع axis=0 وTrueصف كامل4

للتوسع: القيم الفريدة وإعادة الترتيب.

المراجع

  1. NumPy unique
  2. NumPy 2.3.5 unique implementation

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