2016-03-06 61 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

一些调整可以进行,但数据在分裂块。

相关问题