Как вы используете синтаксис нарезки многоточия в Python?
Это появилось в скрытых возможностях Python, но я не вижу хорошей документации или примеров, объясняющих, как работает эта функция.
4 ответа
Вы бы использовали его в своем собственном классе, поскольку ни один встроенный класс не использует его.
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
Конечно, есть документация по питону и языковая справка. Но это не очень полезно.
Многоточие используется для нарезки многомерных структур данных.
Он предназначен для того, чтобы означать на этом этапе, вставить как можно больше полных срезов ( :
) расширить многомерный срез до всех размеров.
Пример:
>>> 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])
В ваших собственных реализациях вы можете игнорировать упомянутый выше контракт и использовать его по своему усмотрению.
Это еще одно использование Ellipsis, которое не имеет ничего общего со срезами: я часто использую его для связи с очередями внутри потока, как знак, обозначающий "Готово"; это там, это объект, это одиночный объект, и его имя означает "отсутствие", и это не чрезмерное 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])
Документация Python не очень ясна по этому поводу, но есть еще один способ использования многоточия. Он используется как представление бесконечных структур данных в случае Python. В этом вопросе обсуждаются как и некоторые актуальные приложения.