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

Posted

技术标签:

【中文标题】有没有办法在 numpy 中执行这个子采样算法?【英文标题】:Is there a way to perform this subsampling algorithm in numpy? 【发布时间】:2016-03-06 18:53:02 【问题描述】:

该算法只是从输入数据数组构建一个新列表。只有当元素超过了前一个存储元素的 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】:

如果你想以这种方式跟踪数据,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')

给:

可能会进行一些调整,但数据会被分割成块。

【讨论】:

以上是关于有没有办法在 numpy 中执行这个子采样算法?的主要内容,如果未能解决你的问题,请参考以下文章

重新采样表示图像的 numpy 数组

将 numpy 切片转换为 Opencv c++ Mat

在 for 循环中删除和添加 numpy 数组行以从更大的 numpy 数组创建动态子数组,

如何在numpy的二维矩阵中随机采样

广播到 Numpy 数组的视图中

如何在 Pandas/Numpy 中使用 dateOffset 对日内时间序列数据进行重新采样?