Подтвердить что ты не робот

Как точно работает режим "отражения" для фильтров scipys ndimage?

Я не понимаю, как именно режим отражения обрабатывает мои массивы. У меня этот очень простой массив:

import numpy as np
from scipy.ndimage.filters import uniform_filter
from scipy.ndimage.filters import median_filter

vector = np.array([[1.0,1.0,1.0,1.0,1.0],[2.0,2.0,2.0,2.0,2.0],[4.0,4.0,4.0,4.0,4.0],[5.0,5.0,5.0,5.0,5.0]])

print(vector)

[[1. 1. 1. 1. 1.]  [2. 2. 2. 2. 2.]  [4. 4. 4. 4. 4.]  [5. 5. 5. 5. 5..]]

Применяя равномерный (средний) фильтр с размером окна 3, я получаю следующее:

filtered = uniform_filter(vector, 3, mode='reflect')

print(filtered)

[[1.33333333 1.33333333 1.33333333 1.33333333 1.33333333]  [2.33333333 2.33333333 2.33333333 2.33333333 2.33333333]  [3.66666667 3.66666667 3.66666667 3.66666667 3.66666667]  [4.66666667 4.66666667 4.66666667 4.66666667 4.66666667]]

Если я попытаюсь воспроизвести упражнение вручную, я получу этот результат. Исходная матрица зеленого цвета, окно оранжевого цвета и желтый. Белые - это "отраженные" наблюдения.

enter image description here

Результат:

enter image description here

Но когда я пробую размер окна 4 или 5, я не могу воспроизвести результаты.

filtered = uniform_filter(vector, 4, mode='reflect')

print(filtered)

[[1,5 1,5 1,5 1,5 1,5]  [2. 2. 2. 2. 2.]  [3. 3. 3. 3. 3.]  [4. 4. 4. 4. 4.]]

Выполнение этого вручную:

enter image description here

И я получаю:

enter image description here

Как обрабатывается окно, если его размер равен? Но в любом случае, если я попытаюсь воспроизвести результаты окна размером 5 и режим, я тоже не могу. Несмотря на то, что я думаю, что поведение аналогично поведению размера 3.

4b9b3361

Ответ 1

Предположим, что данные в одной оси 1 2 3 4 5 6 7 8. В следующей таблице показано, как данные расширяются для каждого режима (при условии cval=0):

    mode       |   Ext   |         Input          |   Ext
    -----------+---------+------------------------+---------
    'mirror'   | 4  3  2 | 1  2  3  4  5  6  7  8 | 7  6  5
    'reflect'  | 3  2  1 | 1  2  3  4  5  6  7  8 | 8  7  6
    'nearest'  | 1  1  1 | 1  2  3  4  5  6  7  8 | 8  8  8
    'constant' | 0  0  0 | 1  2  3  4  5  6  7  8 | 0  0  0
    'wrap'     | 6  7  8 | 1  2  3  4  5  6  7  8 | 1  2  3

Для четного размера окна n рассмотрите окно размера n+1, а затем не включайте нижний и правый края. (Положение окна можно изменить с помощью аргумента origin.)