相关疑难解决方法(0)

改善最小/最大下采样

我有一些大型数组(约1亿个点),我需要以交互方式绘制.我当前正在使用Matplotlib.按原样绘制数组变得非常慢并且是浪费,因为无论如何你都无法想象那么多点.

所以我做了一个min/max抽取函数,我将其绑定到轴的'xlim_changed'回调.我采用最小/最大方法,因为数据包含快速尖峰,我不想通过单步执行数据.有更多的包装器可以裁剪到x限制,并在某些条件下跳过处理,但相关部分如下:

def min_max_downsample(x,y,num_bins):
    """ Break the data into num_bins and returns min/max for each bin"""
    pts_per_bin = x.size // num_bins    

    #Create temp to hold the reshaped & slightly cropped y
    y_temp = y[:num_bins*pts_per_bin].reshape((num_bins, pts_per_bin))
    y_out      = np.empty((num_bins,2))
    #Take the min/max by rows.
    y_out[:,0] = y_temp.max(axis=1)
    y_out[:,1] = y_temp.min(axis=1)
    y_out = y_out.ravel()

    #This duplicates the x-value for each min/max y-pair
    x_out = np.empty((num_bins,2))
    x_out[:] = x[:num_bins*pts_per_bin:pts_per_bin,np.newaxis]
    x_out = x_out.ravel()
    return x_out, y_out
Run Code Online (Sandbox Code Playgroud)

这种方法效果非常好并且足够快(在1e8点和2k箱上约80ms).由于它会定期重新计算和更新线的x和y数据,所以滞后很少.

但是,我唯一的抱怨是x数据.此代码复制每个bin的左边缘的x值,并且不返回y min/max对的真实x位置.我通常将箱数设置为轴像素宽度的两倍.所以你不能真正看到差异,因为垃圾箱太小了......但我知道它在那里......它让我烦恼.

因此尝试编号2确实返回每个最小/最大对的实际x值.然而它大约慢了5倍.

def min_max_downsample_v2(x,y,num_bins):
    pts_per_bin = …
Run Code Online (Sandbox Code Playgroud)

python numpy python-3.x numba

7
推荐指数
1
解决办法
465
查看次数

标签 统计

numba ×1

numpy ×1

python ×1

python-3.x ×1