scipy的ndimage滤波器中的“reflect”模式是如何工作的?
我不太明白反射模式是怎么处理我的数组的。我有一个非常简单的数组:
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]]
如果我试着手动计算这个过程,我可以得到这个结果。原始矩阵用绿色表示,窗口用橙色表示,结果用黄色表示。白色部分是“反射”的观察值。
结果是:
但是当我尝试窗口大小为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. ]]
手动计算的过程:
我得到的结果是:
如果窗口的大小是偶数,应该怎么处理呢?不过无论如何,如果我尝试复制大小为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
参数来改变。)