Как сделать неквадратное скользящее окно для массива пустышек?

1

Как изменить размер функции катящегося окна как окно 2x3 в отличие от окна 3x3, которое находится прямо сейчас? Я недостаточно квалифицирован и понятия не имею, как перепроектировать функцию, чтобы понять, как работает window_size :(

import numpy as np

def rolling_window(array, window_size):
    itemsize = array.itemsize
    shape = (array.shape[0] - window_size + 1,
             array.shape[1] - window_size + 1,
             window_size, window_size)
    strides = (array.shape[1] * itemsize, itemsize,
               array.shape[1] * itemsize, itemsize)
    return np.lib.stride_tricks.as_strided(array, shape=shape, strides=strides)

roller = np.arange(1,16).reshape(3,5)
print(roller)
run = rolling_window(roller,3)
print(run)
  • 0
    @Divakar предлагает хорошее решение здесь stackoverflow.com/questions/47469947/…
  • 0
    ах, отличное решение!
Показать ещё 1 комментарий
Теги:
numpy

1 ответ

0

Если вы знаете, что хотите 2D-окно, тогда укажите window_size[0] чтобы перейти с array.shape[0] и window_size[1] с помощью array.shape[1] когда вы определяете shape:

def rolling_window(array, window_size):
    itemsize = array.itemsize
    # broadcast window_size so it will still work with a scalar:
    window_size = np.broadcast_to(window_size,[2,])
    shape = (array.shape[0] - window_size[0] + 1,
             array.shape[1] - window_size[1] + 1,
             window_size[0], window_size[1])
    # the following would also work:
    # shape = (*np.array(array.shape) - window_size + 1, *window_size)
    strides = (array.shape[1] * itemsize, itemsize,
               array.shape[1] * itemsize, itemsize)
    return np.lib.stride_tricks.as_strided(array, shape=shape, strides=strides)

roller = np.arange(1,16).reshape(3,5)
>>> print(roller)
[[ 1  2  3  4  5]
 [ 6  7  8  9 10]
 [11 12 13 14 15]]

run = rolling_window(roller,[2,3])

>>> run
array([[[[ 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]]]])

Ещё вопросы

Сообщество Overcoder
Наверх
Меню