2011-07-22 7 views

Respuesta

9

Python crea objetos especiales a partir de la sintaxis del sector, pero solo dentro de los corchetes para la indexación. Puede crear esos objetos con la mano (en este caso, (...,0,:) es (Ellipsis, 0, slice(None, None, None)), o puede crear un pequeño objeto de ayuda:

class ExtendedSliceMaker(object): 
    def __getitem__(self, idx): 
     return idx 

>>> ExtendedSliceMaker()[...,0,:] 
(Ellipsis, 0, slice(None, None, None)) 
+0

Esto resuelve directamente el problema, suponiendo que en realidad no le importa la representación o lo que significa porque solo va a pasarla por alto para usarla en Numpy. Pensé básicamente lo mismo, pero le enseñé cómo cavar y descubrir qué es todo :) –

3

El equivalente a (...,0,:) debe ser ...

>>> myslice = (..., 0, slice(None, None)) 
>>> myslice 
(Ellipsis, 0, slice(None, None, None)) 
+0

No, no es 'rebanada (0)'; el '0' es solo un índice. –

+0

@Thomas: Sí, me corrigió a mí mismo. – JAB

0

creo que sólo quiere hacer myslice = rebanada (1,2) para definir, por ejemplo, una rebanada que devolverá el segundo elemento (es decir myarray [myslice] == myarray [1: 2])

3

Lo bueno de Python es que en realidad se puede hacer una clase para inspeccionar cómo estos las cosas están representadas. Python usa el método mágico __getitem__ para manejar operaciones de indexación, así que crearemos una clase que sobrecargue esto para mostrarnos lo que pasó, crear una instancia de la clase e "indexar" a la instancia:

class foo: 
    def __getitem__(self, index): print index 

foo()[...,0,:] 

Y nuestro resultado es:

(Ellipsis, 0, slice(None, None, None)) 

Ellipsis y slice son órdenes internas, y podemos leer su documentación:

help(Ellipsis) 
help(slice) 
5

Uso s_ en NumPy:

In [1]: np.s_[...,0,:] 
Out[1]: (Ellipsis, 0, slice(None, None, None)) 
Cuestiones relacionadas