Разбить трехмерный массив на трехмерные блоки
Я хотел бы разделить массив трехмерных блоков на трехмерные блоки «питоническим» образом. Я работаю с последовательностями изображений, которые представляют собой несколько большие массивы (1000X1200X1600), поэтому мне нужно разделить их на части, чтобы выполнить свою обработку.
Я написал функции для этого, но мне интересно, есть ли какой-нибудь нудистый способ сделать это - numpy.split, похоже, не выполняет то, что я хочу для 3D-массивов (но, возможно, я не понимаю его функциональность)
Чтобы было ясно: код ниже выполняет мою задачу, но я ищу более быстрый способ сделать это.
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)