有没有办法在numpy中执行这个子采样算法?

时间:2016-03-06 18:53:03

标签: python arrays pandas numpy bigdata

该算法只是从输入数据阵列构建一个新列表。一旦元素越过前一个存储元素的visibleDelta阈值,它只会从输入数组中追加一个新元素:

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或其他数值库来执行此操作。

我应该提一下,'真正的'功能不只是处理一维数据。输入数据将是一个pandas数据帧,第一列是x值,第二列是y值(我将比较y值)。

有效地做到这一点吗?

1 个答案:

答案 0 :(得分: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

可能会进行一些调整,但数据会以块的形式进行分割。