Вопрос

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

Это было полезно?

Решение

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

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

Другие советы

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

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

Пример:

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

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

Это еще одно использование многоточия, которое не имеет ничего общего со срезами:Я часто использую его во внутрипотоковом общении с очередями, как метку, сигнализирующую "Готово".;он есть, это объект, это синглтон, и его имя означает "отсутствие", и это не чрезмерно используемое значение None (которое можно было бы поместить в очередь как часть обычного потока данных).ИММВ.

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

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

Пример:

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