remodelar una vista de una matriz n-dimensional sin usar remodelar

tl; dr ¿Puedo cambiar la vista de una matriz numpy de 5x5x5x3x3x3 a 125x1x1x3x3x3 sin usar numpy.reshape?

Me gustaría realizar una operación de ventana deslizante (con diferentes zancadas) a un volumen (tamaño de MxMxM). La matriz de ventana deslizante se puede generar con el uso denumpy.lib.stride_tricks.as_strided, como lo sugirió anteriormenteBenjamín yEickenberg, y demostrado en el fragmento de código a continuación, que utiliza unmétodo auxiliar de skimage que usaas_strided.

El resultado de este método auxiliar me da una forma de NxNxNxnxnxn, pero preferiría que la forma sea N ^ 3x1xnxnxn. Si bien puedo usar np.reshape para lograr esto, np.reshape es lento si el volumen aumenta (> 100x100x100), lo que no estoy seguro de por qué. Pensé que podía usar as_stride para cambiar la forma de la salida, pero los bloqueos numpy (fragmento de código a continuación). ¿Alguna idea sobre cómo puedo obtener una vista de la salida del método auxiliar como N ** 3x1xnxnxn sin usar np.reshape?

import numpy as np
import skimage
l = 15
s = 3
X = np.ones((l,l,l))      
print('actual shape',X.shape)
view = skimage.util.shape.view_as_blocks(X,(s,s,s))    
print('original view',view.shape)

new_shape = ((l/s)**3,1,1,s,s,s)
print('new view',new_shape)    

view_correct = view.reshape(new_shape)
print(view_correct.shape)
print('coord:','124,0,0,2,2,2','value:',view_correct[124,0,0,2,2,2])

view_incorrect = np.lib.stride_tricks.as_strided(view, shape=new_shape)
print(view_incorrect.shape)
print('coord:','124,0,0,2,2,2','value:',view_incorrect[124,0,0,2,2,2])

Respuestas a la pregunta(1)

Su respuesta a la pregunta