【问题标题】:Is there a better way to represent uint8 data有没有更好的方法来表示 uint8 数据
【发布时间】:2012-10-22 19:34:37
【问题描述】:

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

我有一个保存 uint8 数据的 MATLAB MAT 文件。

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 个字节。

【问题讨论】:

  • 你用什么方法保存文件?
  • 为什么将数据作为浮点数写入文本文件?
  • @John,我之前使用 'numpy.savetxt()' 来保存数组。
  • @Warren,正如 Dougal 刚刚提到的,默认的 fmt 参数是 '%.18e'。这就是为什么有这么多数字。

标签: python arrays numpy uint usrp


【解决方案1】:

您可能正在使用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())

【讨论】:

  • 感谢 Dougal,numpy.save 和 tostring 都非常有用。正如你所说,考虑到标题,在这种情况下 tostring 似乎更好。
【解决方案2】:

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

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

(那个字符串是['\xa2', 'z', '\x87']\x..代表一个字节。)

【讨论】:

  • 感谢 dbaupp!这很有用!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-11
  • 1970-01-01
  • 1970-01-01
  • 2020-05-30
  • 2019-05-14
  • 2013-12-09
  • 2012-03-15
相关资源
最近更新 更多