Це з'явилося в прихованих функціях 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-мірна матриця порядку 2х2х2х2. Для вибору всіх перших елементів у 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]
всі мають однакові ідентифікатори.
id()
повертає однакове значення для обох. Також перевірка за допомогою __array_interface__['data']
показує ту саму адресу пам'яті.
a[indexes, ...]
той час, як a - це навіть одномірний масив!
Це ще одне використання для 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])