2015-11-04 50 views
2

我正试图对加速度计数据(x加速度(ax),y加速度(ay),z加速度(az))实施低通滤波器优化用于活动识别的低通滤波器平滑代码

我已经计算我的阿尔法为0.2

沿x方向

DC分量使用公式

new_ax [N] =(1-α)* new_ax [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] 
+0

另请参见http://stackoverflow.com/questions/21336794/python-recursive-vectorization-with-timeseries和http://stackoverflow.com/questions/21391467/can-i-use-numpy-to-speed -this-loop –

+0

@Warren:感谢您指引我进入正确的页面。 – user1946217

回答

1

首先,它似乎你并不需要

if w+1 <= len(seq): 

在W变量不会超过LEN(SEQ)。

因此减少加工时间只需使用numpy的模块:

import numpy; 

在这里,你会发现,比内置列表快得多阵列和方法。例如,不是循环遍历numpy数组中的每个元素来做一些处理,您可以直接在数组上应用numpy函数,并在几秒钟内而不是几个小时内得到结果。作为示例:

data = numpy.arange(0, 1000000, 128); 
shiftData = numpy.arange(128, 1000000, 128); 
result = (1-alpha)*data[:-1] + shiftdata; 

查看numpy上的一些教程。我使用这个模块处理图像数据,通过比较循环列表会花费我2周来处理5000+图像,而使用numpy类型则需要最多2分钟。

+0

感谢您的回答..我将尝试您的方法 – user1946217

0

假设您正在使用python 2.7。

  • 使用xrange。
  • 计算len(seq)循环内部没有必要,因为它的值没有变化。
  • 访问seq它并不是真的需要,因为您可以实时计算它。
  • 您并不真的需要if声明,因为在您的代码中它始终评估为true(w in range(len(seq))表示w最大值将为len(seq)-1)。
  • 您正在做的切片得到subdf并不是真的必要,因为您可以直接访问df(并且切片会创建一个新列表)。

请参阅下面的代码。

n_ax = [] 
SUB_SAMPLE = 128 
SAMPLE_LEN = 1000000 
seq_len = SAMPLE_LEN/SUB_SAMPLE 
for w in xrange(seq_len): 
    prev_x = 0 
    for i in xrange(w*SUB_SAMPLE,(w+1)*SUB_SAMPLE): 
     new_x = (1-alpha)*prev_x + (alpha*df.ax[i]) 
     n_ax.append(new_x) 
     prev_x = new_x 

我想不出任何其他明显的优化。如果这仍然很慢,也许您应该考虑将df数据复制到python本机数据类型。如果这些都是浮动的,请使用python array,它可以提供非常好的性能。

如果你仍然需要更好的性能,你可以尝试与multiprocessing模块并行,或者编写一个C模块,它在内存中获取一个数组,并进行计算,并用​​python库调用它。