我使用medfilt过滤三维数组(a,b,c)
std::shared_ptr<T[]>
如果我像这样分开过滤3个组件
import scipy as sp
import numpy as np
a = np.random.rand(180000)
b = np.random.rand(180000)
c = np.random.rand(180000)
然后将它们组合成一个numpy数组
x = sp.signal.medfilt(a,3)
y = sp.signal.medfilt(b, 3)
z = sp.signal.medfilt(c, 3)
我得到的结果与我同时过滤3个组件的结果不同......
out1 = np.array([x,y,z]).T
你能解释一下为什么吗?
答案 0 :(得分:0)
对于2D
堆叠数组,我们需要使用2D
version of median filter
,以及每个维度的内核大小列表。
因此,我们会 -
from scipy.signal import medfilt2d
out2 = medfilt2d(sigIn,[3,1])
示例运行 -
In [49]: n = 4
...: a = np.random.rand(n)
...: b = np.random.rand(n)
...: c = np.random.rand(n)
...:
...: x = medfilt(a,3)
...: y = medfilt(b, 3)
...: z = medfilt(c, 3)
...:
...: out1 = np.array([x,y,z]).T
...:
In [53]: from scipy.signal import medfilt2d
In [54]: sigIn = np.array([a,b,c]).T
In [55]: out2 = medfilt2d(sigIn,[3,1])
In [56]: np.allclose(out1, out2)
Out[56]: True
作为旁注,我们可以使用np.column_stack
进行堆叠操作,从而避免使用transpose
,如此 -
sigIn = np.column_stack((a,b,c))