使用NumPy数组数据编写原始二进制文件

Pet*_*ter 17 python binary numpy

我想将numpy float数组的内容保存为原始二进制文件,作为带符号的16位整数.我尝试使用ndarray.tofile完成此操作,但我无法找出正确的格式字符串.似乎文件以双格式保存,不管我如何选择格式字符串.我该怎么做呢?谢谢.

Bi *_*ico 38

我认为最简单的方法是首先将数组转换为int16,

array.astype('int16').tofile(filename)
Run Code Online (Sandbox Code Playgroud)

  • `tofile`只写数组的原始二进制数据,而不是数组的元数据.一个典型的用例是打开文件,编写适合文件类型的头文件,并使用`tofile`填写原始数据.读取文件的软件负责从标题中推断出元数据(字节顺序,精度,形状),并将原始数据变为适合该平台的形式.没有元数据,就无法正确解释数组的原始内容.如果您只需要读取和写入数组,请查看"python hd5"或"numpy.save". (5认同)
  • [numpy 文档](http://docs.scipy.org/doc/numpy-1.10.1/reference/generated/numpy.ndarray.tofile.html) 指出“有关字节顺序和精度的信息丢失”。这是否保证适用于所有平台? (3认同)
  • 还没有测试过这个......但你可以[显式设置字节顺序](https://docs.scipy.org/doc/numpy-1.13.0/reference/arrays.dtypes.html)。`dtype('<i')` 是一个小端有符号整数。这应该使您的脚本输出平台独立,除非我误解了文档。据我了解,默认操作是使用机器本机字节序,这将使代码输出平台相关。 (2认同)

Jas*_*gan 8

看一下struct模块,试试这个例子:

import struct
import numpy

f=open("myfile","wb")
mydata=numpy.random.random(10)
print(mydata)
myfmt='f'*len(mydata)
#  You can use 'd' for double and < or > to force endinness
bin=struct.pack(myfmt,*mydata)
print(bin)
f.write(bin)
f.close()
Run Code Online (Sandbox Code Playgroud)

  • 根据经验,我强烈建议**反对使用`struct.pack`.它的API要求你将数组解析(即使用`*`运算符)到变量中,对于大数组大小,这会大大影响性能**.数组的每个元素都需要在堆栈上创建一个新的,即时64位指针(在64位机器上)以指向该元素.只需坚持`tostring` /`tobytes` /`tofile`就可以避免这种开销.例如,在我们的例子中,我们处理的是100 Mb数组,这导致了高达6.4 Gb的RAM,因此`struct.pack`可以完成它的工作. (13认同)