تقنية

item: هل الفهرس الواحد يختار صفًا؟

قيم الأصل وأرقامها المسطحة.
item(1) عنصر، وa[1] صف.

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

اكتب نوع الفهرس الذي تمرره

تميز وثائق item بين عدد واحد يُفسر فهرسًا مسطحًا، وزوج داخل tuple يُفسر إحداثيات متعددة الأبعاد. [1] لا نستبدل هذا العقد بعقد اختيار صف من المحور الأول.

نختار NumPy 2.3.5، وننشئ a=np.array([[11,-2,7],[4,9,-5]],dtype=np.int64). لها صفان وثلاثة أعمدة وستة عناصر، والشكل (2,3). الأعداد مؤلفة بلا وحدة.

ترقيم الصفوف والأعمدة يبدأ من صفر. الإحداثي (1,0) يعني أول عنصر من الصف الثاني. أما الفهرس المسطح 1 فلا يعني الصف الثاني؛ سنحسب موقعه مع عدد الأعمدة.

نسجل القيم والشكل ونوع الناتج لكل قراءة. عدد واحد من Python ليس صفًا ذا شكل (3,)، حتى إن استعملنا الرقم نفسه داخل أقواس استدعاء أو أقواس فهرسة.

قارن عنصرًا مسطحًا بصف كامل

أعادت a.item(1) العدد −2 من نوع int في Python. وفي المقابل أعادت a[1] الصف [4,9,−5] من نوع int64 وشكل (3,). الرقم 1 واحد، لكن مجال الفهرسة مختلف.

في مرجع قوائمنا نقرأ الصف الأول كاملًا ثم الثاني: [11,−2,7,4,9,−5]. العنصر ذو الرقم المسطح 1 هو −2، والعنصر ذو الرقم 3 هو 4.

نحسب الإحداثي بالقسمة والباقي على عدد الأعمدة: divmod(3,3)=(1,0). لذلك أعادت a.item(3) وa.item((1,0)) العدد 4 نفسه، وكل منهما int في Python.

جربنا أيضًا a[3]. رفعت IndexError، لأن المحور الأول لا يملك صفًا ذا فهرس 3. نجاح item(3) لا ينشئ صفًا ثالثًا أو رابعًا في a.

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

أعد حساب الإحداثي بعد نقل المحاور

أنشأنا t=a.T، فصار الشكل (3,2) والقيم [[11,4],[−2,9],[7,−5]]. قرأنا علم F_CONTIGUOUS صحيحًا وعلم C_CONTIGUOUS خطأ في هذا العرض المحدد.

مع عمودين، divmod(3,2)=(1,1). أعادت t.item(3) وt.item((1,1)) العدد 9، بدل 4 الذي أعادته item(3) من الأصل ذي الأعمدة الثلاثة.

مرجعنا المسطح للعرض هو [11,4,−2,9,7,−5]. نقرأ الصفوف المنطقية لهذا الشكل الجديد؛ لا ننقل قاعدة ثلاثة أعمدة من الأصل إلى عرض له عمودان.

توثق flatiter ترتيب C بأنه يغير الفهرس الأخير أسرع. [2] وفي دالة array_toscalar المقروءة من مصدر الإصدار 2.3.5، يحول فرع الفهرس المفرد العدد إلى إحداثيات بالقسمة والباقي من المحور الأخير. [3]

لم نستدع flatiter في الفحص، ولم نطابق مصدر C مع الملف الثنائي المثبت. دليل item العددي هو التشغيل المحفوظ؛ قراءة المصدر تدعم تفسير الفرع ضمن نطاقها المعلن.

قراءة t[1] أعادت الصف [−2,9] بشكل (2,)، وt[3] رفعت IndexError. وجود علم F لم يجعل العدد الواحد في item طلب صف، أو يبقِ إحداثي item(3) كما كان في الأصل.

قيم العرض المنقول وأرقامها المسطحة.
عدد الأعمدة يغير إحداثي الفهرس 3.

حدد نطاق الفحوص واحفظ الشكل مع الرقم

أضفنا المدخل الصفري وست قيم كلها 5، والتركيبات الأربع والستين من {−2,3} في ست خانات. مع المثال أصبح لدينا 67 مدخلًا مختلفًا.

لكل مدخل أنشأنا مصفوفة int64 مستقلة من صفين وثلاثة أعمدة وعرضها المنقول. عند كل فهرس مسطح من صفر إلى 5، قرأنا item بالعدد وبزوج الإحداثيات الموافق للشكل الحالي.

عدد الاستدعاءات 67×2×6×2=1608، وحفظنا 1608 أعداد int من Python. قارناها بقيم قوائم مؤلفة، لا بمخرج دالة تحويل أخرى من NumPy.

أضفنا 268 قراءة مساعدة بالأقواس: صف الفهرس 1 ومحاولة الفهرس 3 لكل أصل وعرض. سجلنا 134 حالة IndexError و134 صفًا تحوي إجمالًا 335 قيمة محفوظة، خارج عد مخرجات item.

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

لم نفحص item دون وسيط، أو فهارسها السالبة والخاطئة، أو object وlongdouble وvoid، أو أشكالًا وأنواعًا أخرى أو فئات مشتقة أو الكتابة أو العناوين الفعلية أو الذاكرة والأداء. احفظ الشكل إلى جانب الفهرس المسطح؛ عدد الأعمدة جزء من تحويله إلى إحداثي في مثالنا.

القراءةالناتجمجال الفهرس
a.item(1)−2 / Python intمسطح
a[1][4,9,−5] / صفالمحور الأول
a.item(3)4 / (1,0)مسطح
a.T.item(3)9 / (1,1)مسطح بالشكل المنقول

للتوسع: ترتيب إعادة التشكيل والمنقول.

المراجع

  1. NumPy ndarray item
  2. NumPy flatiter
  3. NumPy versioned item C source

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