2016-03-06 60 views
2

算法只是從輸入數據數組中構建一個新列表。它僅追加從輸入陣列中的新的元素一旦元件已經越過先前的存儲元件的visibleDelta閾:有沒有辦法在numpy中執行這種subsampling算法?

def subsample(data, visibleDelta): 
    subsampled = [data[0]] 

    for point in data[1:]: 
     if abs(point - subsampled[len(subsampled) - 1]) > visibleDelta: 
      subsampled.append(point) 

    return subsampled 

問題是我需要這個運行在非常大的數據集(〜1B值),並且我如果可能的話,喜歡使用numpy或其他數字庫來做到這一點。

我應該提到,'真正'的功能不會只處理一維數組數據。輸入數據將是熊貓數據框,第一列是x值,第二列是y值(我將比較y值)。

任何方式來有效地做到這一點?

回答

2

如果你想以這種方式跟蹤數據,numpy不是好工具,請參閱Numba或Cython的效率。

一個稍微不同的方法是確定的閾值,看看當數據到達他們:

data=sin(arange(1e6)/3e4) 
visibledelta=0.2 
cat=floor(data/visibledelta) 
subsample=arange(data.size-1)[diff(cat).astype(bool)] 
plot(data) 
plot(subsample,data[subsample],'o') 

這給:

enter image description here

一些調整可以進行,但數據在分裂塊。

相關問題