Isso surgiu nos recursos ocultos do Python , mas não consigo ver boa documentação ou exemplos que explicam como o recurso funciona.
Isso surgiu nos recursos ocultos do Python , mas não consigo ver boa documentação ou exemplos que explicam como o recurso funciona.
Respostas:
Ellipsis
, ou ...
não é um recurso oculto, é apenas uma constante. É bem diferente, digamos, do javascript ES6, onde faz parte da sintaxe da linguagem. Nenhuma classe incorporada ou constituição de linguagem Python faz uso dela.
Portanto, a sintaxe depende inteiramente de você, ou de alguém, ter escrito um código para entendê-lo.
O Numpy usa-o, conforme indicado na documentação . Alguns exemplos aqui .
Na sua própria classe, você usaria assim:
>>> 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
Obviamente, existe a documentação do python e a referência da linguagem . Mas esses não são muito úteis.
As reticências são usadas em numpy para cortar estruturas de dados de dimensões mais altas.
Ele foi projetado para significar que , neste ponto, insira tantas fatias completas ( :
) para estender a fatia multidimensional a todas as dimensões .
Exemplo :
>>> from numpy import arange
>>> a = arange(16).reshape(2,2,2,2)
Agora, você tem uma matriz quadridimensional da ordem 2x2x2x2. Para selecionar todos os primeiros elementos na quarta dimensão, você pode usar a notação de reticências
>>> a[..., 0].flatten()
array([ 0, 2, 4, 6, 8, 10, 12, 14])
que é equivalente a
>>> a[:,:,:,0].flatten()
array([ 0, 2, 4, 6, 8, 10, 12, 14])
Em suas próprias implementações, você pode ignorar o contrato mencionado acima e usá-lo para o que achar melhor.
a[:,:,:,0]
retornará uma cópia e a[...,0]
retornará a "visualização" e não a cópia? Tentei rodar id()
com as duas versões e com uma matriz tridimensional: a[:,:,:, 0], a[:,:,:, 1], a[:,:,:, 2]
todos têm IDs diferentes, enquanto: a[..., 0], a[..., 1], a[..., 2]
todos têm os mesmos IDs.
id()
retorna o mesmo valor para ambos. Também verificar com __array_interface__['data']
mostra o mesmo endereço de memória.
a[indexes, ...]
enquanto a é uma matriz 1-dimensional;
Esse é outro uso da elipse, que não tem nada a ver com fatias: costumo usá-la na comunicação intra-thread com filas, como uma marca que sinaliza "Concluído"; está lá, é um objeto, é um singleton e seu nome significa "falta de", e não é o None em excesso (que pode ser colocado em uma fila como parte do fluxo de dados normal). YMMV.
Conforme indicado em outras respostas, ele pode ser usado para criar fatias. Útil quando você não deseja escrever muitas notações de fatias completas ( :
) ou quando não tem certeza sobre qual é a dimensionalidade da matriz que está sendo manipulada.
O que achei importante destacar, e que faltava nas outras respostas, é que ele pode ser usado mesmo quando não há mais dimensões a serem preenchidas.
Exemplo:
>>> from numpy import arange
>>> a = arange(4).reshape(2,2)
Isso resultará em erro:
>>> a[:,0,:]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: too many indices for array
Isso funcionará:
a[...,0,:]
array([0, 1])