Dividir uma matriz numpy 3D em blocos 3D

Eu gostaria de dividir uma matriz numpy 3D em blocos 3D de uma forma 'pitônica'. Estou trabalhando com sequências de imagens que são matrizes um pouco grandes (1000X1200X1600), então preciso dividi-las em partes para fazer meu processamento.

Eu escrevi funções para fazer isso, mas estou me perguntando se existe uma maneira numpy nativa de fazer isso - o numpy.split não parece fazer o que eu quero para matrizes 3D (mas talvez eu não entenda sua funcionalidade)

Para ser claro: o código abaixo realiza minha tarefa, mas estou procurando uma maneira mais rápida de fazê-lo.

def make_blocks(x,t):
#x should be a yXmXn matrix, and t should even divides m,n
#returns a list of 3D blocks of size yXtXt 
    down =  range(0,x.shape[1],t)
    across = range(0,x.shape[2],t)
    reshaped = []
    for d in down:
        for a in across:
            reshaped.append(x[:,d:d+t,a:a+t])
    return reshaped

def unmake_blocks(x,d,m,n):
#this takes a list of matrix blocks of size dXd that is m*n/d^2 long 
#returns a 2D array of size mXn
    rows = []
    for i in range(0,int(m/d)):
        rows.append(np.hstack(x[i*int(n/d):(i+1)*int(n/d)]))
    return np.vstack(rows)

questionAnswers(1)

yourAnswerToTheQuestion