Для эффективного масштабирования я использую следующий подход. Работает в 5 раз быстрее repeat
и в 10 раз быстрее kron
. Сначала инициализируйте целевой массив, чтобы заполнить масштабированный массив на месте. И заранее определить ломтики, чтобы выиграть несколько циклов:
K = 2 # scale factor
a_x = numpy.zeros((h * K, w *K), dtype = a.dtype) # upscaled array
Y = a_x.shape[0]
X = a_x.shape[1]
myslices = []
for y in range(0, K) :
for x in range(0, K) :
s = slice(y,Y,K), slice(x,X,K)
myslices.append(s)
Теперь эта функция будет делать шкалу:
def scale(A, B, slices): # fill A with B through slices
for s in slices: A[s] = B
Или то же самое просто в одной функции:
def scale(A, B, k): # fill A with B scaled by k
Y = A.shape[0]
X = A.shape[1]
for y in range(0, k):
for x in range(0, k):
A[y:Y:k, x:X:k] = B