تقنية

result_type: هل العدد الصحيح وint يعطيان النوع نفسه؟

عددان صحيحان.
نوع معاد ثابت.

مع متجه float32 بالقيم [−61,65]، أعطى result_type العدد الصحيح 61 وصف float32، لكنه أعطى الفئة int وصف float64. نضيف عددًا كبيرًا وتحكم NumPy int64، ونحفظ إصدار التشغيل دون تنفيذ حساب على العناصر.

عدد وفئة وإصدار

تعيد result_type وصف نوع؛ ونميز عدد Python عن فئته. [1] [2]

يذكر شرح صفحة result_type تأثير قيمة العدد، بينما يوضح دليل ترقية NumPy 2.3 تجاهل دقة عدد Python منذ 2.0. [1] [2] نربط مثالنا بالإصدار المشغل ولا نفترض استمرار شرح القيمة القديم.

وتشرح NEP 50 إزالة الاعتماد على القيم في الترقية. [3] لا ننقل إعدادات تجريبية لإصدار قديم إلى تشغيلنا أو نغير حالة المكتبة لكي نجعل مثالًا متوقعًا ينجح.

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

نسجل NumPy 2.3.5 وCPython 3.12.14، ونبقي الحالة المعلنة في حدود متجه float32 ومدخلات صحيحة أو فئة int. لا نحول الخلاصة إلى قاعدة لكل نوع وعملية.

عدد صغير وآخر كبير

أنشأنا a=np.array([-61,65],dtype=np.float32)، بالشكل (2,). ثم استدعينا np.result_type(a,61)، حيث المدخل الثاني عدد Python من builtins.int. رجع وصف float32 من الفئة f وبحجم عنصر 4 بايتات.

وفي نداء منفصل أبقينا a، ومررنا 2**161، وهو عدد Python صحيح أكبر من 61. رجع وصف float32 أيضًا. نحفظ القوة بصيغة 2**161، ونحفظ القيمة الصحيحة الكاملة في سجل التنفيذ.

هنا لم يبدل تكبير العدد الاسم المعاد. لم نفحص كيف سيتصرف جمع a بهذا العدد، ولم نحوله إلى float32 أو نضعه في عنصر من عناصر المصفوفة. نتيجة وصف النوع وحدها لا تثبت حفظ العدد بدقة في عملية أخرى.

بقيا نداءين لهما مدخلان ثانيان مختلفان. لا نسمي العدد الكبير عددًا من int64 لأن المصفوفة من float32، ولا نغير فئة Python التي سجلناها كي توافق اسم الناتج.

وحفظنا بايتات a قبل النداءين وبعدهما؛ بقيت ثابتة مع نوع float32 والشكل (2,). لا توجد مصفوفة ناتجة تحتوي على رقمين محولين في سجل العودة.

الرسم يعرض مدخل Python الصغير والكبير في صفين، ويضع float32 في عمود وصف العودة. يشير اتفاق العمود إلى النتيجتين المسجلتين فقط، ولا يحذف فرق القيمتين من ملف المدخلات.

الفئة وتحكم ثابت النوع

غيرنا المدخل الثاني إلى int نفسها، أي فئة العدد الصحيح في Python؛ ليست العدد 61 وليست نداء int(61). أعاد np.result_type(a,int) وصف float64 من الفئة f وبحجم عنصر 8 بايتات.

في الفحص المساعد np.dtype(int)، ظهر الاسم int64 والفئة i وحجم عنصر 8 بايتات في هذا التشغيل. نذكر هذه الملاحظة مع الحاسوب والإصدار؛ لا نفترض عرضًا افتراضيًا موحدًا لكل منصة أو نسخة قديمة.

ثم أنشأنا np.int64(61) كعدد NumPy ثابت النوع، واستعملناه مع a في نداء آخر. رجع وصف float64 كذلك. يمثل هذا المدخل قيمة عددية من numpy.int64، بينما كان int السابق كائن فئة من builtins.type.

تساوى العدد المعلن 61 بين مدخل Python الأول ومدخل NumPy الأخير، لكن اختلف الاسمان المعادان float32 وfloat64. لذلك نحفظ فئة المدخل إلى جانب قيمته بدل كتابة العدد وحده في كل صف.

ولم تتغير a إلى float64 حين رجع هذا الوصف. بقيت من float32 بالشكل (2,) وبالبايتات نفسها. الاسم المعاد يصف نتيجة سؤال النوع؛ تغيير تخزين البيانات يحتاج إلى عملية أخرى لم ننفذها.

ولا نضع إشارة مساواة بين الفئة int والعدد np.int64(61) بسبب اتفاق الوصف المعاد. إنهما مدخلان مختلفان في سجلنا، وقد اتفقت نتيجة السؤال المحدد عليهما.

فئة وعدد NumPy.
تحكمات النوع.

حصر الحالات وحدودها

اخترنا 17 عددًا صحيحًا n من 61 إلى 77 شاملًا. لكل n متجه float32 مستقل بالقيم [−n,n+4]، وأربعة مدخلات مقابلة: n من Python، و2**(n+100) من Python، والفئة int، والعدد np.int64(n).

القوى الكبيرة من 2**161 إلى 2**177 ضمن الحالات المعلنة. والمدخل الصغير من 61 إلى 77. لا نسمي الفئة int قيمة تغيرت مع n؛ أعطينا الفئة نفسها لكل متجه جديد على حدة.

كان لكل متجه أربعة نداءات، فصار العدد 17×4=68. عاد 68 كائن dtype دون سجل خطأ: 34 بوصف float32 و34 بوصف float64. لا توجد 68 قيمة عددية أصلية أو 68 مصفوفة خرجت من result_type.

حفظنا الاسم وkind وitemsize وفئة كائن الوصف لكل عودة. هذه خصائص مرافقة للكائن الواحد، وليست مخارج مستقلة نضيفها إلى العدد 68. وفحص نوع int الافتراضي إجراء مساعد معلن خارج عد هذه النداءات.

أعلن جدول المرجع float32 للحالتين العدديتين من Python، وfloat64 للفئة int ولعدد NumPy int64، قبل استدعاء result_type. وبنى struct بايتات المتجهات من الأعداد المعلنة؛ وافقت النتائج المرجع وبقيت البايتات ثابتة. لم تستعمل التوقعات دالة ترقية لكي تصنع جوابها.

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

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

Argument with float32 vectorArgument kindReturned dtype
61Python int valuefloat32
2**161Python int valuefloat32
intPython classfloat64
np.int64(61)NumPy scalarfloat64

للتوسع: معنى فئة النتيجة.

المراجع

  1. NumPy result_type
  2. NumPy 2.3 promotion
  3. NEP 50

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