





Ellipsis или ... - это не скрытая функция, это просто константа. Это сильно отличается, скажем, от javascript ES6, где он является частью синтаксиса языка. Ни один встроенный класс или конструкция языка 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 и ссылка на язык. Но это не очень помогает.
@Ronny: Дело в том, чтобы продемонстрировать индивидуальное использование Ellipsis.
Ссылки кажутся неработающими.
Многоточие используется в numpy для нарезки многомерных структур данных.
Он предназначен для обозначения на этом этапе вставьте столько полных срезов (:), чтобы расширить многомерный срез до всех измерений..
Пример:
>>> 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])
В ваших собственных реализациях вы можете игнорировать упомянутый выше контракт и использовать его по своему усмотрению.
Возможно, я ошибаюсь, но разве a[:,:,:,0] не вернет копию, а a[...,0] вернет «вид», а не копию? Я попытался запустить id() для обеих версий и для 3-мерного массива: все a[:,:,:, 0], a[:,:,:, 1], a[:,:,:, 2] имеют разные идентификаторы, тогда как: a[..., 0], a[..., 1], a[..., 2] все имеют одинаковые идентификаторы.
@ mohitsharma44 не на моей машине;) id() возвращает одинаковое значение для обоих. Также проверка с помощью __array_interface__['data'] показывает тот же адрес памяти.
Я считаю, что мы можем использовать a[indexes, ...], даже если a - это одномерный массив!
что такое 4-х мерная матрица? Имеет смысл называть его 4-х мерным массивом, а не матрицей. IMO.
Эллипсы также полезны для нульмерных структур данных. Это единственный известный мне способ записи в скалярный numpy.ndarrays, например: my_scalar = np.asarray (3); my_scalar [...] = 5. Если вы выполните my_scalar [:] = 5, вы по праву получите ошибку, потому что нет измерения 0 для: для итерации.
@SuperElectric Вы также можете использовать my_scalar.itemset (scalarvalue). Конечно, my_scalar [...] = scalar_value короче, но в приведенном выше комментарии вы сказали, что это единственный способ узнать. Просто даю альтернативу.
Это еще одно использование многоточия, которое не имеет ничего общего со срезами: я часто использую его во внутрипотоковом взаимодействии с очередями, как метку, сигнализирующую «Готово»; он есть, это объект, это синглтон, и его имя означает «недостаток», и это не чрезмерно используемый None (который может быть помещен в очередь как часть обычного потока данных). YMMV.
Может быть, было бы яснее просто сказать где-нибудь: «Done = object ()» и просто использовать это?
Не обязательно - это требует, чтобы вы на самом деле где-то сказать Done = object (). Значения Sentinel не обязательно плохие - и использование почти бесполезных синглтонов Python в качестве часового не так уж и ужасно IMO (Ellipsis и () - это те, которые я использовал, где None не сбивает с толку).
Что касается Done = object (), я думаю, что использовать многоточие лучше, особенно если вы используете его для связи с очередями. Если вы перейдете от внутрипоточного к внутрипроцессному взаимодействию, идентификатор (Done) не будет таким же в другом процессе, и нет ничего, что могло бы отличить один объект от другого. Идентификатор многоточия тоже не будет таким же, но, по крайней мере, тип будет таким же - это точка синглтона.
Вопрос гласит: «Как вы используете многоточие?», Но я считаю, что вы ошиблись. У него много толкований. Но я думаю, что правильный вопрос: «Как используется многоточие?» т.е. «Какие шаги я должен предпринять, чтобы использовать многоточие в моем собственном коде».
Как указано в других ответах, его можно использовать для создания срезов.
Полезно, если вы не хотите писать много нотаций полных срезов (:) или когда вы просто не уверены в размерности обрабатываемого массива.
Я счел важным выделить то, чего не хватало в других ответах, - это то, что его можно использовать, даже когда больше нет измерений, которые нужно заполнить.
Пример:
>>> 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])
выглядит совершенно неуместно, поскольку "правильный" способ обозначить все элементы - >>> x [:] >>> x [:, 1: 2]