Если вы имеете дело только с numpy
массивами, я думаю, что slicing
будет достаточно
Скажем, форма загруженного массива numpy
равна (m, n)
(один канал), ицелевая форма (a, b)
.Тогда шаг может быть (s1, s2) = (m // a, n // b)
Таким образом, исходный массив может быть нарезан на
new_array = old_array[::s1, ::s2]
РЕДАКТИРОВАТЬ
Масштабировать массив также довольно просто, если вы используете маски для продвинутой нарезкиНапример, форма исходного массива - (m, n)
, а целевая форма - (a, b)
.Тогда в качестве примера
a, b = 300, 200
m, n = 3, 4
original = np.linspace(1, 12, 12).reshape(3, 4)
canvas = np.zeros((a, b))
(s1, s2) = (a // m, b // n) # the scalar
# the two masks
mask_x = np.concatenate([np.ones(s1) * ind for ind in range(m)])
mask_y = np.concatenate([np.ones(s2) * ind for ind in range(n)])
# make sure the residuals are taken into account
if len(mask_x) < a: mask_x = np.concatenate([mask_x, np.ones(len(mask_x) % a) * (m - 1)])
if len(mask_y) < b: mask_y = np.concatenate([mask_y, np.ones(len(mask_y) % b) * (n - 1)])
mask_x = mask_x.astype(np.int8).tolist()
mask_y = mask_y.astype(np.int8).tolist()
canvas = original[mask_x, :]
canvas = canvas[:, mask_y]