如何优化此数据平滑 python 循环?

问题描述

我正在尝试在一组数据上创建数据平滑函数,我正在使用 savitzky golay 过滤器来执行此操作,我正在收集一组数据并通过 Scipy 调用函数。 但是由于我在不同帧中循环遍历特定元素,因此我没有空间局部性也没有时间局部性。 dataobj.body.data[j][0][i] 持有 (x,y) 而我只收集 y

这是以下循环:

def smooth_data(dataobj):
    number_of_frames = len(dataobj.body.data)
    for i in range(0,137):
        arr = []
        for j in range(0,number_of_frames):
            arr.append(dataobj.body.data[j][0][i][1])
        newdata = scipy.signal.savgol_filter(arr,25,3)
        for k in range(0,number_of_frames):
            dataobj.body.data[k][0][i][1] = newdata[k]
    return dataobj

我想让它工作得更快,现在当帧数超过 1000 时,它需要相当长的时间,比如 30 秒。 非常感谢所有的帮助者!

解决方法

用 50% 的 x 和 y 数据训练 Krige 模型(只是多项式插值),然后在整个集合 x 上对模型进行 ^y 评估怎么样? Krige 模型代码示例(使用 smt 模块):

from smt.surrogate_models import KRG
t= KRG(theta0=[1e-2]*ndim,print_prediction = False)
t.set_training_values(xt,yt) #training inputs,outputs
t.train()

# Prediction of the other points
y = t.predict_values(xtest)
,

如果输入的数据是一个多维的numpy数组,那么可以将numpy数组的一个切片传入scipy方法,然后将得到的数组插入回原数据对象中:

def smooth_data(dataobj):
    number_of_frames = len(dataobj[:,1])
    number_of_records = len(dataobj[0,:,1])
    for i in range(0,number_of_records):
        newdata = scipy.signal.savgol_filter(dataobj[:,i,1],3,1)
        dataobj[:][0][i][1] = newdata
    return dataobj