Это пришло в скрытых функциях Python , но я не вижу хорошей документации или примеров, объясняющих, как работает эта функция.
Это пришло в скрытых функциях Python , но я не вижу хорошей документации или примеров, объясняющих, как работает эта функция.
Ответы:
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
Конечно, есть документация по питону и языковая справка . Но это не очень полезно.
Многоточие используется для нарезки многомерных структур данных.
На данный момент:
он предназначен для вставки как можно большего количества полных срезов ( ), чтобы расширить многомерный срез до всех измерений .
Пример :
>>> 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-dim: у a[:,:,:, 0], a[:,:,:, 1], a[:,:,:, 2]
всех разные идентификаторы, тогда как у a[..., 0], a[..., 1], a[..., 2]
всех одинаковые идентификаторы.
id()
возвращает одинаковое значение для обоих. Также проверка с __array_interface__['data']
показывает тот же адрес памяти.
a[indexes, ...]
то время как даже одномерный массив!
Это еще одно использование 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])