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

如何优化此数据平滑python循环?,python,loops,optimization,scipy,smoothing,Python,Loops,Optimization,Scipy,Smoothing,我试图在一组数据上创建一个数据平滑函数,我正在使用savitzky golay filter。为了做到这一点,我正在收集一组数据,并通过Scipy调用该函数。 但是因为我在不同的框架中循环通过一个特定的元素,所以我没有空间位置和时间位置。 dataobj.body.data[j][0][i] 保持(x,y),我只收集ys 下面是以下循环: def smooth_data(dataobj): number_of_frames = len(dataobj.body.data) for

我试图在一组数据上创建一个数据平滑函数,我正在使用savitzky golay filter。为了做到这一点,我正在收集一组数据,并通过Scipy调用该函数。 但是因为我在不同的框架中循环通过一个特定的元素,所以我没有空间位置和时间位置。
dataobj.body.data[j][0][i]
保持
(x,y)
,我只收集
y
s

下面是以下循环:

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数据训练克里格模型(只是多项式插值),然后在整个集合x上对模型进行^y评估,怎么样? 克里格模型代码示例(使用smt模块):


如果输入数据是多维numpy数组,则可以将numpy数组的一部分传递给scipy方法,然后将生成的数组插入到原始数据对象中:

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

嘿,康纳,数组的初始化在循环中,因为我没有在同一个数组上重复执行平滑函数。啊,是的,对不起。在这种情况下,最好的办法是尝试传入原始数组的一个片段,以避免复制它。它是普通Python数组还是numpy数组?你可以控制形状吗?它是一个numpy数组,正如你所注意到的,外部循环从0变为一个常量,但是帧数在变化,所以我不认为在这种情况下控制形状会有什么帮助。好的,如果它是一个numpy数组,你应该能够将一个切片传递给scipy,我编辑了答案以反映这一点。嘿,康纳,它成功了,现在快多了,非常感谢
def smooth_data(dataobj):
    number_of_frames = len(dataobj[:,0,0,1])
    number_of_records = len(dataobj[0,0,:,1])
    for i in range(0, number_of_records):
        newdata = scipy.signal.savgol_filter(dataobj[:,0,i,1], 3, 1)
        dataobj[:][0][i][1] = newdata
    return dataobj