Dividir la lista en partes separadas pero superpuestas

Digamos que tengo una lista A

 A = [1,2,3,4,5,6,7,8,9,10] 

Me gustaría crear una nueva lista (por ejemplo, B ) utilizando la lista anterior en el siguiente orden.

 B = [[1,2,3], [3,4,5], [5,6,7], [7,8,9], [9,10,]] 

es decir, los primeros 3 números como A[0,1,2] y los segundos 3 números como A[2,3,4] y así sucesivamente.

Creo que hay una función en numpy para este tipo de operación.

Simplemente use la comprensión de la lista incorporada de Python con la división de listas para hacer esto:

 >>> A = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] >>> size = 3 >>> step = 2 >>> A = [A[i : i + size] for i in range(0, len(A), step)] 

Esto te da lo que estás buscando:

 >>> A [[1, 2, 3], [3, 4, 5], [5, 6, 7], [7, 8, 9], [9, 10]] 

Pero tendrá que escribir un par de líneas para asegurarse de que su código no se rompa con valores de tamaño / paso sin precedentes.

La matriz de partición ‘duplicada’ en N trozos con Numpy sugiere np.split – eso está bien para las divisiones no superpuestas. El ejemplo (añadido después del cierre?) Se superpone, un elemento a través de cada subarreglo. Además se rellena con un 0.

¿Cómo se divide una lista en trozos de tamaño uniforme? tiene algunas respuestas correctas de la lista, con varias formas de generador o lista de comprensión, pero a primera vista no vi ninguna que permita superposiciones, aunque con un uso inteligente de los iteradores (como iterator.tee ) que debería ser posible.

Podemos culpar de esto a la mala redacción de las preguntas, pero no es un duplicado.

Trabajando desde el ejemplo y el comentario:

Aquí el tamaño de mi ventana es 3., es decir, cada lista dividida debe tener 3 elementos, la primera división [1,2,3] y el tamaño del paso es 2, por lo que la segunda división debe comenzar desde el 3er elemento y la 2ª división es [3,4 , 5] respectivamente.

Aquí hay una solución avanzada usando as_strided

 In [64]: ast=np.lib.index_tricks.as_strided # shorthand In [65]: A=np.arange(1,12) In [66]: ast(A,shape=[5,3],strides=(8,4)) Out[66]: array([[ 1, 2, 3], [ 3, 4, 5], [ 5, 6, 7], [ 7, 8, 9], [ 9, 10, 11]]) 

Aumenté el rango de A porque no quería lidiar con el pad 0.

Elegir la shape destino es fácil, 5 series de 3. Elegir las zancadas requiere más conocimientos sobre las zancadas.

 In [69]: x.strides Out[69]: (4,) 

El paso en 1d, o paso de un elemento a otro, es de 4 bytes (la longitud de un elemento). El paso de una fila a la siguiente es 2 elementos del original, o 2 * 4 bytes.

as_strided produce una vista. Por lo tanto, cambiar un elemento en él afectará al original, y puede cambiar los valores superpuestos. Agrega .copy() para hacer una copia; Matemáticas con la matriz de pasos también producirá una copia.

Cambiar las zancadas puede dar filas que no se superpongan, pero tenga cuidado con la forma, es posible acceder a valores fuera del búfer de datos original.

 In [82]: ast(A,shape=[4,3],strides=(12,4)) Out[82]: array([[ 1, 2, 3], [ 4, 5, 6], [ 7, 8, 9], [10, 11, 17]]) In [84]: ast(A,shape=[3,3],strides=(16,4)) Out[84]: array([[ 1, 2, 3], [ 5, 6, 7], [ 9, 10, 11]])