Как вы используете синтаксис нарезки многоточия в Python? - PullRequest
141 голосов
/ 23 сентября 2008

Это появилось в Скрытые возможности Python , но я не вижу хорошей документации или примеров, объясняющих, как работает эта функция.

Ответы [ 4 ]

209 голосов
/ 23 сентября 2008

Многоточие используется для нарезки многомерных структур данных.

Это означает, что на данный момент , вставьте столько полных срезов (:), чтобы расширить многомерный срез до всех размеров .

Пример :

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

Теперь у вас есть 4-мерная матрица порядка 2x2x2x2. Чтобы выбрать все первые элементы в 4-м измерении, вы можете использовать многоточие

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

, что эквивалентно

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

В ваших собственных реализациях вы можете игнорировать упомянутый выше контракт и использовать его по своему усмотрению.

95 голосов
/ 23 сентября 2008

Вы бы использовали его в своем собственном классе, поскольку ни один встроенный класс не использует его.

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

Конечно, есть документация Python и справочник по языку . Но это не очень полезно.

69 голосов
/ 23 сентября 2008

Это еще одно использование для Ellipsis, которое не имеет ничего общего со срезами: я часто использую его во внутрипотоковом взаимодействии с очередями, как знак, который сигнализирует «Готово»; это там, это объект, это одиночный объект, и его имя означает «отсутствие», и это не чрезмерное None (которое может быть помещено в очередь как часть обычного потока данных). YMMV.

2 голосов
/ 07 июня 2018

Как указано в других ответах, его можно использовать для создания слайсов. Полезно, когда вы не хотите писать много нотаций полных срезов (:), или когда вы просто не уверены, какова размерность манипулируемого массива.

То, что я считал важным выделить, и чего не хватало в других ответах, - это то, что его можно использовать даже тогда, когда больше не нужно заполнять измерения.

Пример:

>>> 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])
...