我有一个关于UINT8数据表示的问题。
我有一个MATLAB MAT文件,其中保存了UINT8数据。
使用scipy.io.loadmat()
,垫子文件正在读取为Python,并形成了字典。从字典中提取了与垫子文件提交的数据相对应的数组。阵列看起来像:
array[[162],[122],...[135],dtype:uint8]
之后,将此数组保存到TXT格式中,以供以后的文件读取。但是,TXT文件中的数据是双重精度。例如,uint8
数据162
保存为1.620000000000000000e+02
。这不是我想要的,因为它会占据太多的记忆。
我需要的是,从 source_file.read()
中的每个字节都对应于一个 uint8
数据。
是否有更好的方法来表示UINT8数据?将UINT8转换为字符串是可能的,但仍需要2-3个字节。
您大概是使用numpy.savetxt
,它具有默认的fmt
参数'%.18e'
,含义为"指数格式,具有18位精度。"
您可以将其更改为会吐出整数的东西(例如fmt='%d'
),但在文件空间使用方面仍然效率低下(因为它是ASCII-编码整数)。
numpy.save
的效率二进制格式更加有效,尽管它包含一些标题(格式说明),但它更接近您的要求。如果您只需要二进制数据,那么DBAUPP建议的tostring
是要走的方法:
with open('outfile', 'wb') as f:
f.write(the_array.tostring())
numpy具有tostring()
和fromstring()
,它们在ndarray
数据结构和二进制字符串之间转换。例如
> a = numpy.array([162,122,135], dtype=numpy.uint8)
> a.tostring()
'xa2zx87'
(该字符串是['xa2', 'z', 'x87']
,x..
代表一个字节。)