Лучший способ сослаться на первый элемент каждого прокручивающегося скользящего окна обратно в исходный массив? - PullRequest
0 голосов
/ 02 декабря 2018

У меня есть функция прокручиваемого окна, определенная ниже, чтобы «катиться» по массиву.Функция определена ниже.

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]]]]

Мне нужно сослаться на все эти первые элементы из подмассива обратно в положение основного массива.Я думаю о добавлении выходных значений в список, а затем сделать другую функцию для поиска в основном массиве, чтобы найти положение каждого первого числа.Есть ли более элегантный способ сделать это в одной функции или правильный вызов разделить ее на несколько функций?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...