我有1D numpy元组,结构为dtype
。我正在使用np.savetxt
将数组写入(压缩的)csv文件。我只想添加dtype
中的字段名称作为第一行的标题。当我打印array.dtype时,我得到了
数组是类型为
的对象[('time', '<u8'), ('timeStr', '|S27'), ('person', '|S24'), ...]
我认为从array.dtype创建一个元组('time', 'timeStr', 'person'...)
并将其添加为数组中的第一个元组可能很简单但是dtype对象似乎很难处理(例如,你不能迭代它)。
有一种简单的方法吗?
编辑:senderle指出array.dtype.names存在,它解决了第一个问题。但是,理想情况下,我想输出一个gzip压缩的csv文件,而不先写出完整的csv文件,然后压缩它。 np.savetxt原生支持压缩,但是将头添加到numpy数组似乎会导致问题,因为它的类型错误。
答案 0 :(得分: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
,解压后的内容与上面列出的内容相同。