Это появилось в скрытых функциях Python, но я не вижу хорошей документации или примеров, которые объясните, как работает эта функция.
Как вы используете синтаксис нарезки многоточием в Python?
Ответы (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 и справочник по языку. Но это не очень помогает.
Многоточие используется в 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]
все имеют одинаковые идентификаторы.
- person mohitsharma44; 05.10.2016
id()
возвращает одинаковое значение для обоих. Также проверка с помощью __array_interface__['data']
показывает тот же адрес памяти.
- person BoltzmannBrain; 30.03.2017
a[indexes, ...]
, в то время как a даже является одномерным массивом!
- person acgtyrant; 22.05.2017
Это еще одно использование многоточия, которое не имеет ничего общего со срезами: я часто использую его во внутрипотоковом взаимодействии с очередями, как метку, сигнализирующую «Готово»; он есть, это объект, это синглтон, и его имя означает «недостаток», и это не чрезмерно используемый None (который может быть помещен в очередь как часть обычного потока данных). YMMV.
Как указано в других ответах, его можно использовать для создания срезов. Полезно, когда вы не хотите писать много нотаций полных срезов (:
) или когда вы просто не уверены в размерности обрабатываемого массива.
Я счел важным выделить то, чего не хватало в других ответах, - это то, что его можно использовать, даже когда больше нет измерений, которые нужно заполнить.
Пример:
>>> 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])