علوم وفضاء

insert: هل القناع المنطقي يساوي تحويله إلى 0 و1؟

قناع منطقي وفهارس صحيحة تعطيان إدراجين أو ثلاثة.
القناع والتحويل الصريح مختلفان.

إذا أردت إدراج قيمة عند خانات مختارة، فقد تحوّل قناع True وFalse إلى أعداد صحيحة قبل تمريره. نقارن الطلبين على بيانات مؤلفة؛ تغيير نوع وسيط الفهرسة غيّر النتيجة هنا.

نوع الفهرس ومعناه

توضح وثيقة insert أن الفهارس المنطقية تعامل كقناع، بدل تحويلها إلى العددين 0 و1. [1]

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

موضعان أو ثلاثة إدراجات

شغّلنا NumPy 2.3.5 على CPython 3.12.14. أنشأنا A=np.array([9,-2,4],dtype=np.int64)، وM=np.array([True,False,True],dtype=np.bool_). أدخلنا القيمة المفردة 7، دون تحديد axis.

أعاد np.insert(A,M,7) القيم [7,9,-2,7,4] من int64 بالشكل (5,). موضعا True في قناعنا هما 0 و2: قيمة 7 قبل 9، وأخرى قبل 4. لم نحذف -2 الواقعة أمام False.

ثم كوّنا I=M.astype(np.int64)، فصار [1,0,1]. أعاد np.insert(A,I,7) القيم [7,9,7,7,-2,4] من int64 بالشكل (6,). الفهارس الآن مواضع صحيحة: إدراج واحد قبل 0 وإدراجان قبل 1.

لم تعد False قرارًا بتجاوز خانة في النداء الثاني؛ صارت 0 يطلب الإدراج قبل البداية. نقارن النوع والقائمة الكاملة والعدد، بدل عد قيم 7 وحدها؛ فالأصل قد يحتوي القيمة المدرجة في أمثلة أخرى.

تحكم كله False

أبقينا A والقيمة 7، واستعملنا Z=np.array([False,False,False],dtype=np.bool_). أعاد np.insert(A,Z,7) القيم الأصلية [9,-2,4] من int64 بالشكل (3,)، بلا إضافات.

في التحكم المقابل، Z.astype(np.int64) تعطي [0,0,0]. خرج np.insert(A,Z.astype(np.int64),7) هو [7,7,7,9,-2,4] بالشكل (6,) ومن int64؛ كل صفر طلب إدراجًا قبل الخانة الأولى.

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

قناع كله False ومقابله الصحيح كله صفر.
عدم اختيار موضع لا يساوي اختيار البداية.

المرجع وحدود الفحص

كتب مرجع Python مواضع True بالتعداد، وحوّل القيم المنطقية إلى 0 و1 مستقلًا. لكل موضع أصلي، يضيف نسخًا من القيمة بقدر مرات طلب الإدراج قبله، ثم يضيف القيمة الأصلية. لا يستعمل المرجع insert أو where أو nonzero أو flatnonzero من NumPy.

الشبكة تضم 27 مدخلًا بطول ثلاثة، من القيم −2 و0 و3. مع كل مدخل جرّبنا الأقنعة الثمانية بطول ثلاثة، والقيمتين المفردتين 7 و−4. العدد 27×8×2=432 حالة؛ أضفنا مثالنا وتحكمه ذوي المدخل [9,-2,4] خارج الشبكة، فصار العدد 434.

لكل حالة خمس مجموعات تحقق: خرج القناع أمام المرجع؛ وخرج الفهارس المحوّلة أمامه؛ وشكل الخرجين ونوعهما؛ وثبات بايتات المدخلات؛ وعدد الإضافات، وهو عدد True للقناع وطول قائمة الفهارس المحوّلة. شغّلنا insert مرتين لكل حالة: 868 نداءً، و434×5=2170 مجموعة مرت.

النطاق int64 أحادي بطول ثلاثة، وقناع bool بالطول نفسه، وتحويل صريح إلى int64، وقيمة صحيحة مفردة مع axis=None. لم نفحص أبعادًا أو أطوالًا أخرى، أو قناعًا غير متوافق، أو فهارس سالبة وخارج المجال، أو متجه قيم مختلفة، أو أنواعًا أخرى وكتابة عبر النتائج وأداء.

لم نشغّل إصدارًا أقدم للمقارنة. النتائج المسجلة تخص NumPy 2.3.5؛ نحتفظ بالنوع والإصدار مع وسيط الفهرسة عندما نراجع برنامجًا يعتمد هذا السلوك.

وسيط الفهرسةالمضافالقيم المسجلة
bool: True,False,True27,9,-2,7,4
int64: 1,0,137,9,7,7,-2,4
bool: False,False,False09,-2,4
int64: 0,0,037,7,7,9,-2,4

للتوسع: موضع الإدراج واختبار العضوية.

المراجع

  1. NumPy insert

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