Изменение формы, изменение оси (или транспонирование осей) и изменение формы, чтобы получить overDone
назад -
xy.reshape(20,8,20,8).swapaxes(1,2).reshape(400,8,8)
Подробнее о intuition behind nd-to-nd array transformation
.
Сделайте его универсальным для обработки общих форм -
m,n = xy.shape
M,N = 20,20 # block size used to get xy
overDone_ = xy.reshape(M,m//M,N,n//N).swapaxes(1,2).reshape(-1,m//M,n//N)
Пробный прогон -
# Original input
In [21]: overDone = np.random.rand(400,8,8)
# Perform forward step to get xy
In [22]: xy = np.vstack(np.hstack(overDone[20*i:20+20*i]) for i in range(overDone.shape[0]//20))
# Use proposed approach to get back overDone
In [23]: out = xy.reshape(20,8,20,8).swapaxes(1,2).reshape(400,8,8)
# Verify output to be same as overDone
In [42]: np.array_equal(out,overDone)
Out[42]: True
Бонус:
Мы могли бы использовать те же векторизованные reshape+permute-axes
шаги для создания xy
для процесса пересылки -
xy = overDone.reshape(20,20,8,8).swapaxes(1,2).reshape(160,160)