有没有更好的方法来表示uint8数据

时间:2012-10-22 19:34:38

标签: python arrays numpy uint usrp

我对uint8数据的表示有疑问。

我有一个MATLAB MAT文件,其中保存了uint8数据。

MAT文件使用scipy.io.loadmat()读入Python并形成字典。 从字典中提取对应于MAT文件的数据字段的数组。 该数组看起来像:

array[[162],[122],...[135],dtype:uint8]

之后,此数组将保存为txt格式,以便以后读取文件。 但是,txt文件中的数据是双精度的。例如,uint8数据162保存为1.620000000000000000e+02。这不是我想要的,因为它会占用太多的记忆。

我需要的是source_file.read()中的每个字节对应一个uint8数据。

有没有更好的方法来表示uint8数据?可以将uint8转换为字符串,但仍需要2-3个字节。

2 个答案:

答案 0 :(得分:7)

您可能正在使用numpy.savetxt,其默认fmt参数'%.18e',意思是“采用18位精度的指数格式。”

您可以将其更改为会吐出整数(例如fmt='%d'),但在文件空间使用方面仍然效率很低(因为它是ASCII编码的整数)。

numpy.save是一种更有效的二进制格式,它更接近您的要求,但它包含一些标题(format description)。如果您只想要二进制数据,那么tostring as suggested by dbaupp就可以了:

with open('outfile', 'wb') as f:
    f.write(the_array.tostring())

答案 1 :(得分:4)

Numpy有tostring()fromstring(),它们在ndarray数据结构和二进制字符串之间进行转换。 E.g。

> a = numpy.array([162,122,135], dtype=numpy.uint8)
> a.tostring()
'\xa2z\x87'

(该字符串为['\xa2', 'z', '\x87']\x..表示单个字节。)