Как вы используете синтаксис разрезания многоточия в Python?

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

Ответы

Ответ 1

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

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, а ссылка на язык. Но это не очень полезно.

Ответ 2

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

Он предназначен для обозначения на этом этапе вставки как можно большего количества полных фрагментов (:) для расширения многомерного фрагмента ко всем измерениям.

Пример:

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

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

Ответ 3

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

Ответ 4

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

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

Пример:

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

Ответ 5

Документация Python не очень понятна, но есть и другое использование многоточия. Он используется как представление бесконечных структур данных в случае Python. Этот вопрос обсуждает как и некоторые актуальные приложения.