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

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

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
171
0
50 305
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

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

выглядит совершенно неуместно, поскольку "правильный" способ обозначить все элементы - >>> x [:] >>> x [:, 1: 2]

Ronny 08.05.2009 16:53

@Ronny: Дело в том, чтобы продемонстрировать индивидуальное использование Ellipsis.

nosklo 08.05.2009 18:42

Ссылки кажутся неработающими.

SwiftsNamesake 26.02.2015 11:03

Многоточие используется в 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 05.10.2016 21:59

@ mohitsharma44 не на моей машине;) id() возвращает одинаковое значение для обоих. Также проверка с помощью __array_interface__['data'] показывает тот же адрес памяти.

BoltzmannBrain 30.03.2017 20:27

Я считаю, что мы можем использовать a[indexes, ...], даже если a - это одномерный массив!

acgtyrant 22.05.2017 11:14

что такое 4-х мерная матрица? Имеет смысл называть его 4-х мерным массивом, а не матрицей. IMO.

kmario23 20.01.2018 05:39

Эллипсы также полезны для нульмерных структур данных. Это единственный известный мне способ записи в скалярный numpy.ndarrays, например: my_scalar = np.asarray (3); my_scalar [...] = 5. Если вы выполните my_scalar [:] = 5, вы по праву получите ошибку, потому что нет измерения 0 для: для итерации.

SuperElectric 13.02.2018 14:21

@SuperElectric Вы также можете использовать my_scalar.itemset (scalarvalue). Конечно, my_scalar [...] = scalar_value короче, но в приведенном выше комментарии вы сказали, что это единственный способ узнать. Просто даю альтернативу.

kamathln 02.03.2018 08:03

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

Может быть, было бы яснее просто сказать где-нибудь: «Done = object ()» и просто использовать это?

Brandon Rhodes 21.04.2009 18:05

Не обязательно - это требует, чтобы вы на самом деле где-то сказать Done = object (). Значения Sentinel не обязательно плохие - и использование почти бесполезных синглтонов Python в качестве часового не так уж и ужасно IMO (Ellipsis и () - это те, которые я использовал, где None не сбивает с толку).

Rick Copeland 22.06.2009 19:51

Что касается Done = object (), я думаю, что использовать многоточие лучше, особенно если вы используете его для связи с очередями. Если вы перейдете от внутрипоточного к внутрипроцессному взаимодействию, идентификатор (Done) не будет таким же в другом процессе, и нет ничего, что могло бы отличить один объект от другого. Идентификатор многоточия тоже не будет таким же, но, по крайней мере, тип будет таким же - это точка синглтона.

Tristan Reid 18.01.2013 22:42

Вопрос гласит: «Как вы используете многоточие?», Но я считаю, что вы ошиблись. У него много толкований. Но я думаю, что правильный вопрос: «Как используется многоточие?» т.е. «Какие шаги я должен предпринять, чтобы использовать многоточие в моем собственном коде».

Lyndon White 23.12.2014 17:15

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

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

Пример:

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

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