嗨,我正在尝试将Sav-gol filter应用于我拥有的3D数据数组(带有xyz坐标的磁场数据)。当我运行程序时,我得到错误:TypeError:expected x和y有相同的长度。我的数组是460798个单位长,每个单位是一些坐标列表[x y z]。我认为它必须对窗口大小参数做一些事情。当我把它放到三,它工作正常,但我的数据点没有平滑。高于三,它不起作用。
我试图让功能平滑3-D阵列。
mag = cdf['Mag'][start_ind:stop_ind) #mag is a 3-D array with coordinate element [x y z]
mag_smoothed = signal.savgol_filter(x=mag, window_length=5, polyorder=2)
print mag_smoothed[1]
我相信我应该得到一个平滑的三维阵列。
File "/Users/sosa/research/Python Files/MagnometerPlot.py", line 33, in plot
mag_smoothed = signal.savgol_filter(x=mag, window_length=7, polyorder=2,axis=1)
File "/Users/sosa/anaconda/lib/python2.7/site-packages/scipy/signal/_savitzky_golay.py", line 339, in savgol_filter
_fit_edges_polyfit(x, window_length, polyorder, deriv, delta, axis, y)
File "/Users/sosa/anaconda/lib/python2.7/site-packages/scipy/signal/_savitzky_golay.py", line 217, in _fit_edges_polyfit
polyorder, deriv, delta, y)
File "/Users/sosa/anaconda/lib/python2.7/site-packages/scipy/signal/_savitzky_golay.py", line 187, in _fit_edge
xx_edge, polyorder)
File "/Users/sosa/anaconda/lib/python2.7/site-packages/numpy/lib/polynomial.py", line 559, in polyfit
raise TypeError("expected x and y to have same length")
TypeError: expected x and y to have same length
答案 0 :(得分:0)
你认为如果我将mag列表的x,y,z组件分开并将过滤器分别应用于每个组件,是否会复制过滤器?
我认为这可能是一个合理的近似值,但这是非常主观的,取决于您计划对数据做些什么。如果您正在尝试进行精确测量,这可能不是处理数据的最佳方式。
由于我不确定您是否正在使用体数据或曲面数据(z是x,y的幅度)。我将使用3D表面作为示例。 (让我们说它是一个二维数组,arr1
)
我们想做什么:用SG平滑表面。
我们可以用scipy的SG-Filter做什么:平滑一维线。
但是表面只是一组并排的线,所以要解决它,我们可能会做以下事情:
1)平滑arr1
中的每一行(轴= 0)。我们将所有平滑的行放入一个新数组arr2
2)现在我们对arr2
(轴= 1)中的每个列执行相同的操作,并生成arr3
,名义上是" 2D -smoothed"表面。
但它不是,不完全。对于给定的数据点,1D滤波器通过计算点本身和几个相邻值来计算新值。但是在2D集中,该数据点具有更多相邻值,而1D滤波器看不到,因为这些值位于错误的行(或列)中。如果可能,它可能会达到不同的值。
说服自己逐步平滑并不完美的最简单方法是两次完成,但第二次颠倒顺序。首先,您要沿着列,然后是行。在一个完美的世界中,最终的结果应该是一致的,无论你是从行还是列开始。因为它是你可能会发现它们略有不同。
如果您的数据非常统一,而且没有多少“锯齿状”。峰值或跳跃(例如噪音)你可能不会有任何问题。否则,您可能会发现两个结果之间存在更显着的差异。
快速谷歌搜索确实显示了有关2D-Savitzky-Golay过滤器的各种讨论,因此调查可能对您有用。