كيف يمكنك استخدام بناء جملة تقطيع القطع الناقص في بايثون؟

StackOverflow https://stackoverflow.com/questions/118370

سؤال

جاء هذا في الميزات الخفية لبيثون, ، لكن لا يمكنني رؤية وثائق أو أمثلة جيدة تشرح كيفية عمل الميزة.

هل كانت مفيدة؟

المحلول

يمكنك استخدامه في فصلك الدراسي، حيث لا يوجد فصل مدمج يستخدمه.

Numpy يستخدمه، كما هو مذكور في توثيق.بعض الأمثلة هنا.

في صفك الخاص، ستستخدمه على النحو التالي:

>>> class TestEllipsis(object):
...     def __getitem__(self, item):
...         if item is Ellipsis:
...             return "Returning all items"
...         else:
...             return "return %r items" % item
... 
>>> x = TestEllipsis()
>>> print x[2]
return 2 items
>>> print x[...]
Returning all items

وبطبيعة الحال، هناك وثائق بايثون, ، و لغة الإشارة.لكن تلك ليست مفيدة للغاية.

نصائح أخرى

يتم استخدام القطع الناقص لشريحة هياكل البيانات ذات الأبعاد الأعلى.

لقد تم تصميمه ليعني عند هذه النقطة، أدخل أكبر عدد ممكن من الشرائح الكاملة (:) لتوسيع الشريحة متعددة الأبعاد إلى جميع الأبعاد.

مثال:

>>> from numpy import arange
>>> a = arange(16).reshape(2,2,2,2)

الآن، لديك مصفوفة رباعية الأبعاد من الرتبة 2x2x2x2.لتحديد كافة العناصر الأولى في البعد الرابع، يمكنك استخدام علامة القطع

>>> a[..., 0].flatten()
array([ 0,  2,  4,  6,  8, 10, 12, 14])

وهو ما يعادل

>>> a[:,:,:,0].flatten()
array([ 0,  2,  4,  6,  8, 10, 12, 14])

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

هذا استخدام آخر لـ Ellipsis، والذي لا علاقة له بالشرائح:غالبًا ما أستخدمه في التواصل داخل سلسلة الرسائل مع قوائم الانتظار، كعلامة تشير إلى "تم"؛إنه موجود، إنه كائن، إنه مفرد، واسمه يعني "عدم وجود"، وهو ليس لا شيء مفرط الاستخدام (والذي يمكن وضعه في قائمة الانتظار كجزء من تدفق البيانات العادي).YMMV.

كما هو مذكور في الإجابات الأخرى، يمكن استخدامه لإنشاء الشرائح.مفيد عندما لا ترغب في كتابة العديد من تدوينات الشرائح الكاملة (:)، أو عندما لا تكون متأكدًا من أبعاد المصفوفة التي يتم التلاعب بها.

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

مثال:

>>> from numpy import arange
>>> a = arange(4).reshape(2,2)

سيؤدي هذا إلى خطأ:

>>> a[:,0,:]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: too many indices for array

هذا سيفي بالغرض:

a[...,0,:]
array([0, 1])
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top