У меня есть функция прокручиваемого окна, определенная ниже, чтобы «катиться» по массиву.Функция определена ниже.
roller = np.arange(1,21).reshape(4,5)
def rolling_window(main_array, sub_array_shape, stepsize_x=1, stepsize_y=1):
strided = np.lib.stride_tricks.as_strided
x_sub_dim, y_sub_dim = sub_array_shape #Define custom sub_array_shape for rolling window.
x_main_dim,y_main_dim = main_array.shape[-2:] # List slice ensures that multi-dimension is not affected
x_main_stride,y_main_stride = main_array.strides[-2:]
out_shp = main_array.shape[:-2] + (x_main_dim - x_sub_dim + 1, y_main_dim - y_sub_dim + 1, x_sub_dim, y_sub_dim)
out_stride = main_array.strides[:-2] + (x_main_stride, y_main_stride, x_main_stride, y_main_stride)
imgs = strided(main_array, shape=out_shp, strides=out_stride)
return imgs[...,::stepsize_x,::stepsize_y,:,:]
rolling_window(roller, (2,3))
Output:
[[[[ 1 2 3]
[ 6 7 8]]
[[ 2 3 4]
[ 7 8 9]]
[[ 3 4 5]
[ 8 9 10]]]
[[[ 6 7 8]
[11 12 13]]
[[ 7 8 9]
[12 13 14]]
[[ 8 9 10]
[13 14 15]]]
[[[11 12 13]
[16 17 18]]
[[12 13 14]
[17 18 19]]
[[13 14 15]
[18 19 20]]]]
Я хотел бы получить первое значение каждого подмассива, такого как этот вывод, и я могу сделать это, изменив свой возвращаемый срез на
return imgs[...,:stepsize_x,:stepsize_y]
Output:
[[[[ 1]]
[[ 2]]
[[ 3]]]
[[[ 6]]
[[ 7]]
[[ 8]]]
[[[11]]
[[12]]
[[13]]]]
Мне нужно сослаться на все эти первые элементы из подмассива обратно в положение основного массива.Я думаю о добавлении выходных значений в список, а затем сделать другую функцию для поиска в основном массиве, чтобы найти положение каждого первого числа.Есть ли более элегантный способ сделать это в одной функции или правильный вызов разделить ее на несколько функций?