قد ترى dtype=int64 في استدعاء ينشئ جدولًا، فتتوقع أن كل نتيجة ستُخزن كعدد صحيح. في fromfunction نحتاج إلى تتبع مرحلتين: الأرقام التي تتلقاها الدالة، والكائن الذي تعيده. سجلنا المرحلتين كي نعرف أين يعمل الخيار.
أي مرحلة يضبطها الخيار؟
تعطي fromfunction الدالة مصفوفات إحداثيات، ويخص dtype هذه المصفوفات؛ الناتج يعاد مباشرة. [1]
نسجل نوع المدخل الذي يصل إلى الدالة منفصلًا عن نوع القيمة التي تنتجها. قد يستخدم الحساب تلك المدخلات لتكوين أعداد عائمة، أو يستخدم شرطًا لتكوين قيم منطقية؛ وجود اسم النوع في الاستدعاء الخارجي لا يكفي لمعرفة المرحلة التي يضبطها.
إحداثيات صحيحة ونتائج تحمل أنصافًا
شغّلنا NumPy 2.3.5 على Python 3.12.14، وطلبنا shape=(2,4) مع dtype=np.int64. سجلت دالتنا f(i,j) الاستدعاء ثم أعادت 10*i+j+0.5. الصيغة والأرقام مؤلفة، وليست قياسات.
وصلت i=[[0,0,0,0],[1,1,1,1]]، ووصلت j=[[0,1,2,3],[0,1,2,3]]. نوع كل شبكة int64 وشكلها (2,4). في التشغيل المسجل وقع استدعاء واحد لدالتنا، وبداخل كل وسيط شبكة كاملة؛ لم نستقبل ثمانية أزواج عددية منفصلة.
أعادت الدالة [[0.5,1.5,2.5,3.5],[10.5,11.5,12.5,13.5]] بالنوع float64. عند الموضع (1,2) نحسب 10×1+2+0.5=12.5. لم يتحول النصف إلى عدد صحيح لمجرد أن الإحداثيات صحيحة.
احتفظت الدالة بإشارة إلى المصفوفة التي أعادتها. الكائن الخارج من fromfunction كان الكائن نفسه بحسب اختبار is. هذا شاهد مباشر على مرور ناتج هذه الدالة دون إنشاء مصفوفة int64 أخرى في المحاولة المحددة.
تحكم يغيّر الدالة وحدها
أبقينا الشكل (2,4) وdtype=np.int64، واستبدلنا الدالة بأخرى تعيد (10*i+j)%3==1. وصلت شبكتا الإحداثيات نفسهما، لكن الناتج صار [[False,True,False,False],[True,False,False,True]] من bool.
في الصف الأول، الرموز 0 و1 و2 و3؛ الشرط يصدق عند 1 وحده. في الثاني، الرموز 10 و11 و12 و13؛ الباقي عند القسمة على 3 يساوي 1 في 10 و13. لذلك تختلف أماكن True حسب الحساب المعلن، لا بسبب استنتاج نوع من أول خانة.
وقع استدعاء واحد أيضًا، وأعادت fromfunction الكائن المنطقي نفسه الذي حفظته دالتنا. إذن الإحداثيات نفسها لا تفرض نوعًا واحدًا على كل دالة نمررها: النتيجتان هنا float64 وbool. ولم نختبر تحويلًا صريحًا للناتج أو دالة تعدّل إحداثياتها.

مرجع مستقل وحدود التجربة
كوّن مرجع Python شبكتي الإحداثيات بحلقتين للصف والعمود، وحسب كل قيمة بصيغة عددية مستقلة. لم يستدع fromfunction أو منشئ NumPy داخل المرجع. قارنا كذلك نوع كل شبكة ونوع النتيجة المعلنين في التنفيذ، ففحص القيم وحده قد يغفل فرق النوع.
اختبرنا ارتفاعات من 1 إلى 4 وعروضًا من 1 إلى 5: عشرون شكلًا. لكل شكل استعملنا إحداثيات int64 وfloat64، ومع كل نوع دالتين: 4*i+j+0.25، وشرط (4*i+j)%3==1. العدد 20×2×2=80 استدعاءً شبكيًا.
أضفنا المثال والتحكم بصيغة تعتمد 10 بدل 4؛ الأرقام فيهما خارج صيغة الشبكة. صار العدد 82 استدعاءً. لكل استدعاء خمس مجموعات تحقق: استدعاء الدالة مرة، وشكل الإحداثيات وقيمها، ونوع الإحداثيات، وقيم الناتج ونوعه وشكله، وهوية الكائن الخارج مع الناتج المحفوظ. الإجمالي 82×5=410، ومرت كلها.
النطاق أشكال ذات محورين وطولين موجبين، ونوعا إحداثيات فقط، ودالتان لا تعدلان المدخلات. لم نفحص أشكالًا فارغة أو بلا محور أو ذات محاور إضافية، أو أنواعًا أخرى وتجاوز مجالها، أو like وأنواع المصفوفات المخصصة، أو دوال تعيد عددًا مفردًا أو تغيّر الشكل، أو الأداء.
عند مراجعة استدعاء مشابه، سجّل نوع الإحداثيات التي وصلت ونوع الكائن الذي عاد. ثم اختبر قيم الدالة وفق غرضك؛ فهم مرحلة dtype لا يثبت أن الصيغة المختارة تمثل بياناتك أو أن أي نوع ناتج مناسب لها.
| نوع الإحداثيات | حساب الدالة | نوع الناتج |
|---|---|---|
| int64 | 10*i+j+0.5 | float64 |
| int64 | (10*i+j)%3==1 | bool |
للتوسع: غلاف vectorize ونوع الخرج.
المراجع
أُعدّ هذا المقال بمساعدة الذكاء الاصطناعي، وخضع لمراجعة ذاتية بالأداة نفسها. لا يُنسب إلى مراجع بشري أو خبير مستقل. منهجية المحتوى.
