【发布时间】:2019-07-22 22:34:45
【问题描述】:
我有一个包含数据帧的大型输入文件(一个数据系列 (complex64),每个帧中都有一个标识头)。它比我的可用内存大。标题重复,但随机排序,例如输入文件可能如下所示:
<FRAME header={0}, data={**first** 500 numbers...}>,
<FRAME header={18}, data={first 500 numbers...}>,
<FRAME header={4}, data={first 500 numbers...}>,
<FRAME header={0}, data={**next** 500 numbers...}>
...
我想将数据排序到一个新文件中,该文件是一个形状为 (len(headers), len(data_series)) 的 numpy 数组。它必须在读取帧时构建输出文件,因为我无法将其全部放入内存中。
我查看了 numpy.savetxt 和 python csv 包,但出于磁盘大小、精度和速度的原因,我希望输出文件是二进制的。 numpy.save 很好,只是我不知道如何让它附加到未知的数组大小。
我必须在 Python2.7 中工作,因为读取这些帧需要一些依赖项。到目前为止,我所做的是使一个函数能够将具有匹配标头的所有帧写入单个二进制文件:
input_data = Funky_Data_Reader_that_doesnt_matter(input_filename)
with open("singleFrameHeader", 'ab') as f:
current_data = input_data.readFrame() # This loads the next frame in the file
if current_data.header == 0:
float_arr = np.array(current_data.data).view(float)
float_arr.tofile(f)
这很好用,但我需要将它扩展为二维。我开始将 h5py 视为一种选择,但希望有一个更简单的解决方案。
最好的东西是
input_data = Funky_Data_Reader_that_doesnt_matter(input_filename)
with open("bigMatrix", 'ab') as f:
current_data = input_data.readFrame() # This loads the next frame in the file
index = current_data.header
float_arr = np.array(current_data.data).view(float)
float_arr.tofile(f, index)
感谢任何帮助。我认为这将是一个更常见的用例,用于以附加模式读取和写入 2D 二进制文件。
【问题讨论】:
-
tofile写入一个平面二进制数组 - 只是数据缓冲区的内容。不保存 shape 和 dtype 等数组属性。所以无论数组是二维的还是散列的,它写的都是一样的。 -
那么所有数据系列的长度都一样吗?
-
@MadPhysicist 是的,所有的长度都是一样的。
-
@nicholas。我已经更新了我的答案以包含该信息。通过单击回答您问题的答案旁边的复选标记,将您的问题从未回答队列中删除是标准程序。
标签: python python-2.7 numpy