Как точно работает режим "отражения" для фильтров 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.
Ответы
Ответ 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
.)