我尝试在加速度计数据上实现一个低通滤波器(使用x加速度(ax)、y加速度(ay)、z加速度(az))
我计算出我的α值是0.2
沿x方向的直流分量用以下公式计算
new_ax[n]=(1-α)*新[n-1]+(α*ax[n])
我可以计算一个只有几千条记录的小数据集。但是我有一个包含一百万条记录的数据集,用下面的代码运行需要很长时间。我将非常感谢任何帮助,即兴发挥我的代码的时间复杂性。在
### df is a pandas dataframe object
n_ax = []
seq = range(0, 1000000, 128)
for w in range(len(seq)):
prev_x = 0
if w+1 <= len(seq):
subdf = df[seq[w]:seq[w+1]]
for i in range(len(subdf)):
n_ax.append((1-alpha)*prev_x + (alpha*subdf.ax[i]))
prev_x = n_ax[i]
首先你似乎不需要
w变量不会超过len(seq)。在
因此,要减少处理时间,只需使用numpy模块:
^{pr2}$在这里,您将找到比内置列表快得多的数组和方法。例如,您可以直接在数组上应用numpy函数,而不是遍历numpy数组中的每个元素来进行一些处理,并且可以在几秒钟内获得结果,而不是几小时。例如:
查看一些关于numpy的教程。我使用这个模块来处理图像数据,相比之下,循环浏览列表需要2周时间来处理5000多个图像,而使用numpy类型最多需要2分钟。在
假设您使用的是python2.7。在
len(seq)
,因为它的值没有变化。在seq
实际上并不需要它,因为您可以动态地计算它。在if
语句,因为在代码中它的计算结果总是为true(w in range(len(seq))
表示w
最大值为len(seq)-1
)。在subdf
而进行的切片并不是真正必要的,因为您可以直接访问df(切片会创建一个新的列表)。在请参阅下面的代码。在
我想不出还有什么明显的优化。如果这仍然很慢,也许您应该考虑将
df
数据复制到python本机数据类型。如果这些都是float,那么使用pythonarray
,它的性能非常好。在如果您还需要更好的性能,可以尝试使用
multiprocessing
模块并行,或者编写一个C模块,在内存中获取一个数组并进行计算,然后用ctypes
python库调用它。在相关问题 更多 >
编程相关推荐