1

我有一个结构化的元组的一维 numpy 数组dtype。我正在使用np.savetxt将数组写入(压缩)csv 文件。我只想将字段名称添加dtype为第一行的标题。当我打印 array.dtype 我得到

数组是一个类型的对象:

[('time', '<u8'), ('timeStr', '|S27'), ('person', '|S24'), ...]

我认为('time', 'timeStr', 'person'...)从array.dtype 中创建一个元组并将其添加为数组中的第一个元组可能很简单,但是dtype 对象似乎很难处理(例如,您不能对其进行迭代)。

有没有一种简单的方法可以做到这一点?

编辑:senderle 指出 array.dtype.names 的存在解决了第一个问题。但是,理想情况下,我想输出一个 gzip 压缩的 csv 文件,而不是先写出完整的 csv 文件,然后再压缩它。np.savetxt 本身支持压缩,但将标头添加到 numpy 数组似乎会导致问题,因为它的类型错误。

4

1 回答 1

2

这是获取字段名称元组的简单方法:

>>> a = numpy.array([(1, 2, 3), (4, 5, 6)], dtype=[('time', '<u8'), 
                                                   ('timeStr', '|S27'), 
                                                   ('person', '|S24')])
>>> a.dtype.names
('time', 'timeStr', 'person')

这是使用数据创建 csv 文件的简单方法:

>>> with open('data.txt', 'w') as datafile:
...     datafile.write(', '.join(a.dtype.names) + '\n')
...     numpy.savetxt(datafile, a, '%i, %s, %s')

之后的内容data.txt

time, timeStr, person
1, 2, 3
4, 5, 6

如果您运行的是 1.7 或更高版本,您也可以传递', '.join(a.dtype.names)给新header参数。(但请注意,最后一个断言未经测试,因为我的版本numpy较旧。)

您可以对模块执行基本相同的操作gzip。不过,这可能会更慢,因为它可能numpy不再处理压缩。做一些测试。

>>> with gzip.GzipFile('data.gz', 'w') as datafile:
...     datafile.write(', '.join(a.dtype.names) + '\n')
...     numpy.savetxt(datafile, a, '%i, %s, %s')
... 

结果是data.gz,解压后与上面列出的内容相同。

于 2012-07-23T18:11:32.483 回答