قد تحمل مصفوفة NumPy عددًا واحدًا دون محاور، ومع ذلك تعيد isscalar لها False. في مثالنا بقي العدد 13 نفسه بين خمسة تمثيلات، لكن نتيجة الاختبار تغيرت مع نوع الكائن. سنقرأ اختبار النوع إلى جانب عدد الأبعاد، ثم نرى أثر استخراج العنصر.
سؤالان مختلفان
تختبر isscalar النوع القياسي؛ تقبل الأعداد والسلاسل المدمجة، وترفض مصفوفة صفرية الأبعاد. [1] قبول النص يمنع تفسيرها مدققًا عدديًا.
أما ndim فتعيد عدد الأبعاد، وتعد القيمة القياسية صفرية الأبعاد؛ وتحاول تحويل المدخل غير المصفوفي إلى مصفوفة عند الحاجة. [2] سؤالها عن الأبعاد يختلف عن سؤال النوع السابق.
توثق صفحة أنواع NumPy استخدام np.generic للتعرف على القيم القياسية الخاصة بالمكتبة. [4] فحصنا انتماء np.int64 في تجربتنا إلى هذه الفئة؛ لا نستنتج منه قواعد لجميع الكائنات المخصصة.
وتتيح item بلا معاملات استخراج عنصر عندما تحتوي المصفوفة عنصرًا واحدًا، مع إرجاع قيمة قياسية لبايثون وفق النوع. [3] نستخدم int64 هنا؛ الأنواع ذات الاستثناءات في الوثيقة خارج مثالنا.
العدد 13 وتمثيلاته
شغلنا NumPy 2.3.5 على CPython 3.12.14. أنشأنا Python int بالقيمة 13، وnp.int64(13)، ومصفوفة a=np.array(13,dtype=np.int64)، ومصفوفة b=np.array([13],dtype=np.int64). هذه قيمة عددية واحدة بأربعة تمثيلات، بلا وحدة قياس.
أعادت isscalar للقيمتين الأوليين True، وأعادت ndim لكل منهما 0. القيمة الخاصة بـNumPy كانت قياسية من فئة np.generic، لكنها ليست المصفوفة a التي تحمل القيمة العددية نفسها.
شكل a هو ()، وحجمها عنصر واحد. أعادت np.ndim(a) القيمة 0، بينما أعادت np.isscalar(a) القيمة False. هذه الحالة هي موضع الاختلاف بين اختبار النوع وشرط ndim(x)==0 في المثال.
شكل b هو (1,)، وحجمها أيضًا عنصر واحد. أعادت ndim لها 1، وأعادت isscalar لها False. احتواء عنصر واحد لا يحدد وحده نجاح الاختبار، ولا يجعل شكلي المصفوفتين متطابقين.
حفظنا بايتات المصفوفتين قبل الاستدعاءات وبعدها؛ بقيت ثابتة. كنا نراقب النوع والشكل ونتائج الاختبارات، ولم ننفذ كتابة في أي منهما.
الاستخراج والتحكم النصي
نفذنا v=a.item() دون معاملات. أعاد هذا الاستدعاء Python int بالقيمة 13؛ فحصنا النوع الدقيق للناتج إلى جانب قيمته. أعادت isscalar(v) القيمة True، وأعادت ndim(v) القيمة 0.
هكذا أعطت a وv عدد أبعاد صفرًا، لكن نتيجتي isscalar اختلفتا: False للمصفوفة وTrue للعدد المستخرج. لا يحتاج تفسير هذا المثال إلى تغيير العدد أو إزالة محور من مصفوفة أخرى.
أضفنا سلسلتين نصيتين مستقلتين: "bud" و"". أعادت isscalar لكل منهما True، وأعادت ndim لكل منهما 0. السلسلة الفارغة هنا ليست اختبارًا لمصفوفة فارغة؛ لم ننشئ مصفوفة فارغة أصلًا.
لا نحول هذا التحكم إلى نصيحة عامة لاستبدال شرط بآخر. سم الخاصية التي يحتاجها برنامجك أولًا: نوع قياسي، أم صفر أبعاد، أم مدخل عددي. التجربة توضح اختلاف نتيجتين ولا تقدم مدققًا عدديًا شاملًا.

العد وحدود الفحص
كررنا التمثيلات الخمسة لكل حمولة صحيحة من 0 إلى 16، مع عرض 13 أولًا. لدينا 17 قيمة عددية مختلفة و85 تمثيلًا عدديًا؛ بإضافة السلسلتين يصبح العدد 87 مدخلًا لا 87 عددًا مختلفًا.
استدعينا isscalar وndim على المدخلات السبعة والثمانين، واستدعينا item بلا معاملات على المصفوفات الصفرية السبع عشرة: 87+87+17=191 استدعاء مسمى. إنشاء 34 مصفوفة و17 قيمة np.int64 خارج هذا العد.
حفظنا 87 نتيجة منطقية و104 نتائج صحيحة: 87 عدد أبعاد و17 قيمة مستخرجة. المقارنات المشتقة ndim(x)==0 لا نعدها مخارج أصلية إضافية. تطابقت فئات النتائج الخمس في القيم السبع عشرة.
بنى المرجع توقعاته من فئات المدخلات المعلنة وأشكالها وحمولاتها الأصلية؛ لم يستعمل مخارج isscalar أو ndim أو item لتوليد النتيجة المتوقعة. راجعنا الأنواع والأشكال وثبات البايتات بصورة منفصلة.
اقتصر الفحص العددي على int64 وهذه الأشكال، والنصي على السلسلتين. لم نفحص مصفوفات متعددة العناصر أو أعلى بعدًا، ولا أنواعًا عددية أخرى أو كائنات مخصصة أو وراثة أو أداء أو ملكية الذاكرة أو معاملات الفهرسة في item. احفظ النوع مع عدد الأبعاد حين تفسر النتيجة.
| Representation | isscalar | ndim |
|---|---|---|
| Python int 13 | True | 0 |
| NumPy int64(13) | True | 0 |
| ndarray shape () | False | 0 |
| ndarray shape (1,) | False | 1 |
| a.item() -> Python int | True | 0 |
للتوسع: قيمة واحدة وأشكال مختلفة.
المراجع
أُعدّ هذا المقال بمساعدة الذكاء الاصطناعي، وخضع لمراجعة ذاتية بالأداة نفسها. لا يُنسب إلى مراجع بشري أو خبير مستقل. منهجية المحتوى.
