Pregunta

Sé que puedo usar algo como string[3:4] para obtener una subcadena en Python, pero lo que lo hace la media de 3 somesequence[::3]?

¿Fue útil?

Solución

que significa 'nada para el primer argumento, nada para el segundo, y saltar por tres'. Se pone cada tercer elemento de la secuencia en rodajas. rebanadas extendidas es lo que quiere. Nuevo en Python 2.3

Otros consejos

direcciones secuencia rebanada Python pueden escribirse como una [Inicio: Fin: paso] y cualquiera de iniciar, detener o final se puede quitar. a[::3] es cada tercer elemento de la secuencia.

seq[::n] es una secuencia de cada n-ésimo elemento de la secuencia completa.

Ejemplo:

>>> range(10)[::2]
[0, 2, 4, 6, 8]

La sintaxis es:

seq[start:end:step]

Por lo que puede hacer:

>>> range(100)[5:18:2]
[5, 7, 9, 11, 13, 15, 17]

Explicación

s[i:j:k] es, según la documentación , "rebanada de s de i a j con el paso k". Cuando i y j están ausentes, toda la secuencia se asume y por lo tanto medios s[::k] "cada k-ésimo elemento".

Ejemplos

En primer lugar, vamos a inicializar una lista:

>>> s = range(20)
>>> s
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]

Vamos a tomar cada er elemento 3 de s:

>>> s[::3]
[0, 3, 6, 9, 12, 15, 18]

Vamos a tomar cada er elemento 3 de s[2:]:

>>> s[2:]
[2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
>>> s[2::3]
[2, 5, 8, 11, 14, 17]

Vamos a tomar cada er elemento 3 de s[5:12]:

>>> s[5:12]
[5, 6, 7, 8, 9, 10, 11]
>>> s[5:12:3]
[5, 8, 11]

Vamos a tomar cada er elemento 3 de s[:10]:

>>> s[:10]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> s[:10:3]
[0, 3, 6, 9]

TL; DR

Este ejemplo visual le mostrará cómo un cuidadosamente seleccionados elementos en un (matriz de 2 dimensiones) NumPy Matrix en una forma bastante entretenido (prometo). Paso 2 a continuación ilustran el uso de esa :: "dos puntos doble" en cuestión.

(Precaución:. Este es un ejemplo array específica NumPy con el objetivo de ilustrar el caso de un uso de :: "dos puntos dobles" para saltar de elementos en varios ejes Este ejemplo no cubre las estructuras de datos nativas de Python como List).

Un ejemplo concreto para gobernarlos a todos ...

Supongamos que tenemos una matriz NumPy que es similar al siguiente:

In [1]: import numpy as np

In [2]: X = np.arange(100).reshape(10,10)

In [3]: X
Out[3]:
array([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14, 15, 16, 17, 18, 19],
       [20, 21, 22, 23, 24, 25, 26, 27, 28, 29],
       [30, 31, 32, 33, 34, 35, 36, 37, 38, 39],
       [40, 41, 42, 43, 44, 45, 46, 47, 48, 49],
       [50, 51, 52, 53, 54, 55, 56, 57, 58, 59],
       [60, 61, 62, 63, 64, 65, 66, 67, 68, 69],
       [70, 71, 72, 73, 74, 75, 76, 77, 78, 79],
       [80, 81, 82, 83, 84, 85, 86, 87, 88, 89],
       [90, 91, 92, 93, 94, 95, 96, 97, 98, 99]])

Say, por alguna razón, su jefe le quiere seleccionar los siguientes elementos:

 introducir descripción de la imagen aquí

"Pero ¿Cómo ???" ... sigue leyendo! (Podemos hacer esto en un enfoque de 2 pasos)

Paso 1 - Obtener subconjunto

Especificar el "índice inicial" y "índice final" en ambas direcciones de modo de fila y columna se refiere.

 introducir descripción de la imagen aquí

En el código:

In [5]: X2 = X[2:9,3:8]

In [6]: X2
Out[6]:
array([[23, 24, 25, 26, 27],
       [33, 34, 35, 36, 37],
       [43, 44, 45, 46, 47],
       [53, 54, 55, 56, 57],
       [63, 64, 65, 66, 67],
       [73, 74, 75, 76, 77],
       [83, 84, 85, 86, 87]])

Aviso ahora acabamos de obtener nuestra subconjunto, con el uso de inicio y sencilla técnica de indexación final. El siguiente paso, cómo hacer que "saltar" ... (sigue leyendo!)

Paso 2 - Seleccionar elementos (con el argumento "salto paso")

Ahora podemos especificar los "pasos" de salto en ambas direcciones por filas y por columnas (para seleccionar elementos en una forma "salto") como este:

 introducir descripción de la imagen aquí

En el código (tenga en cuenta los dos puntos dobles):

In [7]: X3 = X2[::3, ::2]

In [8]: X3
Out[8]:
array([[23, 25, 27],
       [53, 55, 57],
       [83, 85, 87]])

Acabamos seleccionado todos los elementos según sea necesario! :)

Consolidar la Etapa 1 (principio y fin) y la Etapa 2 ( "salto")

Ahora sabemos que el concepto, podemos combinar fácilmente los pasos 1 y 2 en un paso consolidada - de compacidad:

In [9]: X4 = X[2:9,3:8][::3,::2]

    In [10]: X4
    Out[10]:
    array([[23, 25, 27],
           [53, 55, 57],
           [83, 85, 87]])

Listo!

Cuando rebanar en Python el tercer parámetro es el paso. Como han mencionado otros, véase rebanadas extendidas para una buena visión general .

Con este conocimiento, [::3] sólo significa que no se ha especificado ningún índice de inicio o fin para su rebanada. Puesto que usted ha especificado un paso, 3, esto tomará cada tercera entrada de partida something en el primer índice. Por ejemplo:

>>> '123123123'[::3]
'111'

El tercer parámetro es el paso. Así [:: 3] devolvería cada 3er elemento de la lista / cadena.

Python usa el :: separar el Fin, el inicio y el valor Paso.

También puede utilizar esta notación en sus propias clases personalizadas para que haga lo que quiera

class C(object):
    def __getitem__(self, k):
        return k

# Single argument is passed directly.
assert C()[0] == 0

# Multiple indices generate a tuple.
assert C()[0, 1] == (0, 1)

# Slice notation generates a slice object.
assert C()[1:2:3] == slice(1, 2, 3)

# If you omit any part of the slice notation, it becomes None.
assert C()[:] == slice(None, None, None)
assert C()[::] == slice(None, None, None)
assert C()[1::] == slice(1, None, None)
assert C()[:2:] == slice(None, 2, None)
assert C()[::3] == slice(None, None, 3)

# Tuple with a slice object:
assert C()[:, 1] == (slice(None, None, None), 1)

# Ellipsis class object.
assert C()[...] == Ellipsis

A continuación, puede abrir objetos de división como:

s = slice(1, 2, 3)
assert s.start == 1
assert s.stop == 2
assert s.step == 3

Esto se utiliza en particular en Numpy a rebanada matrices multidimensionales en cualquier dirección.

Por supuesto, cualquier API sensata debería utilizar ::3 con el habitual "cada 3" semántica.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top