我有一些大型数组(约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) 我有一个非常大的 XML 日志文件,它会以固定大小 (~200MB) 自动分割。可以有很多部分(通常少于 10 个)。当它拆分时,它不会在记录末尾甚至当前行末尾整齐地进行拆分。一旦达到目标尺寸,它就会分裂。
time基本上我需要解析这些文件中的“记录”元素,然后从每个文件中取出子文件
由于这些日志文件在随机位置分割并且不一定有根目录,因此我将 Python3 和 lxmletree.iterparse与html=True. 这是处理由于分割文件而导致缺少根节点的情况。但是,我不确定如何处理最终在一个文件的末尾和另一个文件的开头之间分割的记录。
以下是分割文件的一个小示例。
文件:测试.001.txt
<records>
<record>
<data>5</data>
<time>1</time>
</record>
<record>
<data>5</data>
<time>2</time>
</record>
<record>
<data>5</data>
<ti
Run Code Online (Sandbox Code Playgroud)
文件:测试.002.txt
me>3</time>
</record>
<record>
<data>6</data>
<time>4</time>
</record>
<record>
<data>6</data>
<time>5</time>
</record>
</records>
Run Code Online (Sandbox Code Playgroud)
这是我尝试过的方法,但我知道它不能正常工作:
from lxml import etree
xmlFiles = []
xmlFiles.append('test.001.txt')
xmlFiles.append('test.002.txt')
timeStamps = []
for xmlF in xmlFiles:
for event, elem in etree.iterparse(xmlF, events=("end",), tag='record',html=True):
tElem = elem.find('time')
if tElem is not None:
timeStamps.append(int(tElem.text))
Run Code Online (Sandbox Code Playgroud)
输出:
In[20] : …Run Code Online (Sandbox Code Playgroud)