Esto surgió en las características ocultas de Python , pero no puedo ver una buena documentación o ejemplos que expliquen cómo funciona la característica.
Esto surgió en las características ocultas de Python , pero no puedo ver una buena documentación o ejemplos que expliquen cómo funciona la característica.
Respuestas:
Ellipsis
o ...
no es una característica oculta, es solo una constante. Es bastante diferente a, digamos, javascript ES6, donde forma parte de la sintaxis del lenguaje. Ninguna clase incorporada o construcción de lenguaje Python hace uso de ella.
Entonces, la sintaxis para ello depende completamente de que usted o alguien más tenga un código escrito para comprenderlo.
Numpy lo usa, como se indica en la documentación . Algunos ejemplos aquí .
En tu propia clase, lo usarías así:
>>> 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
Por supuesto, está la documentación de Python y la referencia del lenguaje . Pero esos no son muy útiles.
La elipsis se utiliza en numpy para cortar estructuras de datos de dimensiones superiores.
Está diseñado para significar en este punto, inserte tantos cortes completos ( :
) para extender el corte multidimensional a todas las dimensiones .
Ejemplo :
>>> from numpy import arange
>>> a = arange(16).reshape(2,2,2,2)
Ahora, tiene una matriz de 4 dimensiones de orden 2x2x2x2. Para seleccionar todos los primeros elementos en la cuarta dimensión, puede usar la notación de puntos suspensivos
>>> a[..., 0].flatten()
array([ 0, 2, 4, 6, 8, 10, 12, 14])
que es equivalente a
>>> a[:,:,:,0].flatten()
array([ 0, 2, 4, 6, 8, 10, 12, 14])
En sus propias implementaciones, puede ignorar el contrato mencionado anteriormente y utilizarlo para lo que considere conveniente.
a[:,:,:,0]
devolverá una copia y a[...,0]
devolverá la "vista" y no la copia? Intenté ejecutar id()
contra ambas versiones y para una matriz de 3 dim: a[:,:,:, 0], a[:,:,:, 1], a[:,:,:, 2]
todos tienen diferentes identificadores, mientras que: a[..., 0], a[..., 1], a[..., 2]
todos tienen los mismos identificadores.
id()
devuelve el mismo valor para ambos. Verificando también __array_interface__['data']
muestra la misma dirección de memoria.
a[indexes, ...]
mientras que a es una matriz de 1 dimensión incluso!
Este es otro uso para Ellipsis, que no tiene nada que ver con cortes: a menudo lo uso en comunicación intra-hilo con colas, como una marca que indica "Hecho"; está allí, es un objeto, es un singleton, y su nombre significa "falta de", y no es el None usado en exceso (que podría ponerse en una cola como parte del flujo de datos normal). YMMV.
Como se indicó en otras respuestas, se puede usar para crear sectores. Útil cuando no desea escribir muchas anotaciones de cortes completos ( :
), o cuando no está seguro de cuál es la dimensionalidad de la matriz que se está manipulando.
Lo que me pareció importante destacar, y que faltaba en las otras respuestas, es que se puede usar incluso cuando no hay más dimensiones que llenar.
Ejemplo:
>>> from numpy import arange
>>> a = arange(4).reshape(2,2)
Esto dará como resultado un error:
>>> a[:,0,:]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: too many indices for array
Esto funcionará:
a[...,0,:]
array([0, 1])