在一个轴上平滑数组
我研究了信号平滑的方法,发现了一个很不错的教程页面 http://wiki.scipy.org/Cookbook/SignalSmooth,这个方法适用于只有一个维度的数组。现在我需要一个可以在一个 (TxNx3) 的数组上沿着 N 轴做同样事情的函数。
这里的背景是,我有 N 个粒子的轨迹和 T 帧数据,每个粒子都有 x、y、z 三个坐标,现在我想在它们的运动上实现某种低通滤波器,这样在视频中看起来就不会那么抖动。
为了更好地说明这个问题:
import numpy as np
from MY_Cookbook_copy import smooth
T = np.random.random((30,30,3)) # this is the trajectory
imshow( T[:,:,0], interpolation='nearest' )
# this works but is too slow and only for the x data
for i in range( T.shape[1] ):
T[:,i,0] = smooth( T[:,i,0], 5 )
imshow( T[:,:,1], interpolation='nearest' )
这样处理后得到的结果是
所以我面临的问题的维度大概是 1000 个粒子和 5000 帧时间数据。
1 个回答
2
你可以试试多维高斯滤波器 - http://docs.scipy.org/doc/scipy/reference/generated/scipy.ndimage.filters.gaussian_filter.html
使用高斯滤波器可以让信号变得更平滑。你可以通过设置sigma为一个元组来在多个维度上应用它,这样每个轴的平滑程度可以不同。我猜你可能只想对x、y、z的值在时间上进行平滑处理,所以你可以试试用sigma设置为(2, 0, 0),不过我对你的数据结构不是很清楚。sigma控制高斯滤波器的宽度,如果你想要非常局部的平滑效果,就用一个小的sigma。你可能需要多试几次,找到你想要的平滑程度。