2010-05-03 12 views
6

La sintaxis de indexación extendida se menciona en el documento de python.Problema con la sintaxis del sector de la lista en python

slice([start], stop[, step]) 

Los objetos de división también se generan cuando se utiliza la sintaxis de indexación extendida. Por ejemplo: a[start:stop:step] o a[start:stop, i]. Vea itertools.islice() para una versión alternativa que devuelve un iterador.

a[start:stop:step] funciona como se describe. Pero, ¿y el segundo? ¿Cómo se usa?

+2

así que usted está preguntando qué 'i' significa "en un [Inicio: parada, i]"? –

+0

Sí, ¿qué es "i" si se supone que es una secuencia? – Dingle

+0

'a' no es necesariamente una secuencia de uno de los tipos primitivos predeterminados. – Amber

Respuesta

10

a[start:stop,i] llama al método a.__getitem__(slice(start,stop,None),i).

Esto plantea un TypeError si a es una lista, pero es una notación válida y útil si a es una matriz numpy. De hecho, creo que los desarrolladores de Numpy pidieron a los desarrolladores de Python que ampliaran la notación de corte Python de forma precisa para que la notación numerada de corte de matrices se pudiera implementar más fácilmente.

Por ejemplo,

import numpy as np 
arr=np.arange(12).reshape(4,3) 
print(arr) 
# [[ 0 1 2] 
# [ 3 4 5] 
# [ 6 7 8] 
# [ 9 10 11]] 

1:3 selecciona filas 1 y 2, y la 2 selecciona la tercera columna:

print(arr[1:3,2]) 
# [5 8] 

PS. Para experimentar con lo que se está rebanada enviado a __getitem__, puede jugar con el código de juguetes:

class Foo(list): 
    def __getitem__(self,key): 
     return repr(key) 

foo=Foo(range(10)) 
print(foo[1:5,1,2]) 
# (slice(1, 5, None), 1, 2) 
+0

Ya veo. Básicamente, a [start: stop, i] solo funciona con arrays multidimensionales como se implementa en numpy. – Dingle

+0

@Dingle: ¡O bien, puede definir sus propias clases con '__getitem__' y asignarle su propio significado y comportamiento! – unutbu

+0

La pregunta es similar a http://stackoverflow.com/questions/752602/slicing-in-python-expressions-documentation, pero su ejemplo y el código de juguete son mucho más fáciles de seguir. – Dingle

3

La notación [:,:] se utiliza para cortar multidimensional arrays. Python no tiene matrices multidimensionales de forma predeterminada, pero la sintaxis lo admite y numpy, por ejemplo, aprovecha esta sintaxis.

+2

Y cualquier otro objeto personalizado que potencialmente haya implementado rebanadas multidimensionales a través de '__getitem __()'. – Amber

Cuestiones relacionadas