我有一些大型数组(约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)