علوم وفضاء

ptp: كيف يظهر مدى سالب من أعداد صحيحة؟

ثلاثة صفوف وناتج مدى موقع.
مدخل مؤلف ومخرجات مسجلة.

المدى السالب يحتاج قراءة نوع الخرج. [1]

معنى الناتج

ptp تحسب الأكبر ناقص الأصغر وتحفظ نوع المدخل؛ المدى قد يظهر سالبًا في الصحيح الموقع. [1]

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

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

الصفوف والبتات

أنشأنا x=np.array([[-100,100,-20],[-7,8,1],[-128,127,0]],dtype=np.int8)، في NumPy 2.3.5 على CPython 3.12.14. الشكل (3,3)؛ نرقم الصفوف والأعمدة بدءًا من الصفر.

في الصف الأول، أصغرنا −100 وأكبرنا 100، فيكون المدى 200. في الثاني لدينا 8−(−7)=15؛ وفي الثالث 127−(−128)=255. هذه عمليات بأعداد Python الصحيحة قبل المقارنة مع التشغيل.

شغّلنا n=np.ptp(x,axis=1)؛ النتيجة [−56,15,−1] بنوع int8 وشكل (3,). الصف ذو المدى 15 بقي موجبًا، والصفان الآخران أعطيا سالبًا. لا نستبدل المديات الرياضية بهذه القراءات.

للمدى 200 نكتب ثماني خانات 11001000؛ أوزان الآحاد دون إشارة هي 128+64+8=200. في نموذج التفسير الموقع نضع وزن الخانة الأولى −128 بدل 128، فنحسب −128+64+8=−56.

وبالمثل، 255 يعطي النمط 11111111؛ مجموع الأوزان الموقعة −128+64+32+16+8+4+2+1=−1. هذه مراجعة لتفسير النمط في المثال، لا رصد لداخل تنفيذ الدالة.

قراءة وتوسيع

view بنوع مختلف قد تعيد تفسير بايتات الذاكرة. [2]

طبقنا n.view(np.uint8)، فقرأنا [200,15,255] بنوع uint8 وشكل (3,). هنا نقرأ نتيجة المدى بعرضها نفسه؛ لم نطبق view على مدخلات x قبل إيجاد الأكبر والأصغر.

طبقنا أيضًا n.astype(np.int16)، فحصلنا على [−56,15,−1] بنوع int16 وشكل (3,). هذه القراءة الأوسع تحفظ الأعداد السالبة المسجلة؛ لم ترجع تلقائيًا إلى المديات 200 و255.

في تحكم آخر شغّلنا np.ptp(x.astype(np.int16),axis=1)، فأعاد [200,15,255] بنوع int16 وشكل (3,). وضعنا تحويل المدخل قبل حساب المدى، وحفظنا بايتات x في جميع المسارات.

لا نعادل المسارات من اسم التحويل: ندوّن نوع المدخل، وموضع العملية، ونوع الخرج والقيم. لم نعدل الناتج عبر view أو نفحص آثار مشاركة الذاكرة؛ اختبارنا يقرأ المخرجات فقط.

قراءة النتيجة وتحويل المدخل.
مسارات مسجلة بأنواعها.

حدود الاستنتاج

عددنا الأزواج المرتبة من الأعداد الصحيحة −128 إلى 127؛ لدينا 256×256=65536 زوجًا، بما فيها المتساوي والمعكوس. لكل زوج أنشأنا مصفوفة int8 بالشكل (1,2) واختزلنا axis=1.

مرجعنا يسير عبر الأعداد بالمقارنتين < و>، ثم يطرح الأصغر من الأكبر بأعداد Python. لا يستدعي ptp أو min أو max في NumPy أو Python. نموذج الخرج الموقع يكتب r إن كان r<128، وإلا r−256.

قارننا لكل زوج أربع نتائج ونوعها وشكلها (1,): ptp بنوع int8؛ وقراءة uint8؛ وحساب int16 بعد تحويل المدخل؛ وتوسيع الناتج إلى int16. الفحص الخامس لثبات بايتات المدخل.

للمثال الرئيسي خمسة فحوص مماثلة، ثم فحص سادس للمدى 200 ونمطه ووزنيه وللحالة الطرفية 255. الإجمالي 65536×5+6=327686، وقد مرت جميع الفحوص.

في المجموعة المعدودة، أكبر فرق ممكن بين الأصغر والأكبر هو 127−(−128)=255؛ وأصغره صفر. ولذلك يصلح مجال 0 إلى 255 لمدياتها الرياضية. قراءة النمط دون إشارة وافقت المرجع في كل زوج؛ هذا استنتاج مدعوم بحدود المجموعة والفحص الفعلي.

لا نطبق الاستنتاج على فروق قد تكون سالبة أصلًا، أو مدخل ملفوف قبل وصوله إلينا. لا تستعيد قراءة نتيجة المدى عناصر الصف نفسها: مدى 200 يمكن أن ينتج عن [−100,100] وعن [−80,120] مثلًا.

استبعدنا الأنواع الأخرى والمحاور الأخرى والمصفوفات الفارغة والمتغيرات المفردة، والعائمة وNaN واللانهاية وout وkeepdims. لم نفحص الأداء أو تبديل عرض view أو آثار تعديل ذاكرة مشتركة؛ وما وراء الأزواج والمثال يحتاج تحققًا مستقلًا.

المسار على المثالالقيم المسجلةالنوع والشكل
ptp(x,axis=1)[-56,15,-1]int8 / (3,)
n.view(uint8)[200,15,255]uint8 / (3,)
n.astype(int16)[-56,15,-1]int16 / (3,)
ptp(x.astype(int16),axis=1)[200,15,255]int16 / (3,)

للتوسع: مجال int8 ونتيجة الجمع.

المراجع

  1. NumPy 2.3 — ptp
  2. NumPy 2.3 — ndarray.view

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