2015-11-04 47 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庫調用它。