2012-07-23 60 views
1

我有一個元組的結構化dtype的一維numpy數組。我正在使用np.savetxt將數組寫入(壓縮)csv文件。我只想添加dtype的字段名稱作爲第一行中的標題。當我打印array.dtype我得到使用python dtype作爲壓縮CSV文件的頭文件

數組類型的對象:

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

我想這可能是簡單的,只是從array.dtype使一個元組('time', 'timeStr', 'person'...)並添加本作中第一個元組數組,但dtype對象似乎很難處理(例如,你不能迭代它)。

有沒有簡單的方法來做到這一點?

編輯:senderle指出array.dtype.names存在,它解決了第一個問題。然而,理想情況下,我想輸出一個gzip壓縮的csv文件,而無需先寫出完整的csv文件,然後進行壓縮。 np.savetxt本身支持壓縮,但將頭添加到numpy數組似乎會導致問題,因爲它具有錯誤的類型。

回答

2

這裏有一個簡單的方法來獲得字段名稱的元組:

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

這裏有一個簡單的方法來創建與數據的csv文件:的data.txt後來

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

內容:

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,其中,解壓縮時,具有相同的內容如上面列出的那些。

+0

哦,太棒了!然而,我顯然不明白閱讀文檔的正確位置。我應該在哪裏尋找dtype.names?例如,它不在http://docs.scipy.org/doc/numpy/reference/generated/numpy.dtype.html。 – Raphael 2012-07-23 18:15:44

+0

與壓縮的csv一起工作嗎? – Raphael 2012-07-23 18:18:41

+0

啊,我想你只是在一段時間後吸收這些東西。我會建議在REPL中使用'dir'和'help'來查找未記錄或未記錄的功能。在這種情況下,我看到'help(a.dtype)'有信息。 – senderle 2012-07-23 18:18:43