Ventanas deslizantes de la matriz 2D que se deslizan a lo largo del eje = 0 o filas para dar una matriz 3D

Tengo una matriz numpy 2-d de este formulario:

[[ 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.]] 

Quiero construir una vista de la matriz, agrupando sus elementos en una ventana móvil (de tamaño 4 en mi ejemplo). Mi resultado debe ser de forma (6, 4, 5) y puedo construirlo de la siguiente manera:

 res = [] mem = 4 for i in range(mem, X.shape[0]+1): res.append(X[i-mem:i, : ]) res = np.asarray(res) print res.shape 

Quiero evitar la reasignación, así que me pregunto si puedo construir una vista para dar este resultado, por ejemplo con as_strided.

Una explicación del proceso es muy bienvenida.

Gracias

Aquí hay un enfoque con np.lib.stride_tricks.as_strided solicitado –

 def strided_axis0(a, L): # INPUTS : # a is array # L is length of array along axis=0 to be cut for forming each subarray # Length of 3D output array along its axis=0 nd0 = a.shape[0] - L + 1 # Store shape and strides info m,n = a.shape s0,s1 = a.strides # Finally use strides to get the 3D array view return np.lib.stride_tricks.as_strided(a, shape=(nd0,L,n), strides=(s0,s0,s1)) 

Ejecución de la muestra

 In [48]: X = np.arange(35).reshape(-1,5) In [49]: X Out[49]: 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]]) In [50]: strided_axis0(X, L=4) Out[50]: array([[[ 0, 1, 2, 3, 4], [ 5, 6, 7, 8, 9], [10, 11, 12, 13, 14], [15, 16, 17, 18, 19]], [[ 5, 6, 7, 8, 9], [10, 11, 12, 13, 14], [15, 16, 17, 18, 19], [20, 21, 22, 23, 24]], [[10, 11, 12, 13, 14], [15, 16, 17, 18, 19], [20, 21, 22, 23, 24], [25, 26, 27, 28, 29]], [[15, 16, 17, 18, 19], [20, 21, 22, 23, 24], [25, 26, 27, 28, 29], [30, 31, 32, 33, 34]]])