2012-03-28 51 views
7

我想使用行和列「標題」信息(如表格)將二維數組保存到CSV文件中。我知道我可以使用numpy.savetxt的頭文件參數來保存列名,但是有沒有簡單的方法可以包含一些其他數組(或列表)作爲第一列數據(如行標題)?Python/Numpy - 使用列和行標題保存數組

下面是我目前如何做的一個例子。有沒有更好的方法來包含這些行標題,也許有一些我不知道的savetxt技巧?

import csv 
import numpy as np 

data = np.arange(12).reshape(3,4) 
# Add a '' for the first column because the row titles go there... 
cols = ['', 'col1', 'col2', 'col3', 'col4'] 
rows = ['row1', 'row2', 'row3'] 

with open('test.csv', 'wb') as f: 
    writer = csv.writer(f) 
    writer.writerow(cols) 
    for row_title, data_row in zip(rows, data): 
     writer.writerow([row_title] + data_row.tolist()) 

回答

6

也許你更願意做這樣的事情:

# Column of row titles 
rows = np.array(['row1', 'row2', 'row3'], dtype='|S20')[:, np.newaxis] 
with open('test.csv', 'w') as f: 
    np.savetxt(f, np.hstack((rows, data)), delimiter=', ', fmt='%s') 

這是隱式轉換data到字符串數組,大約需要200毫秒在我的電腦每萬件。

dtype '|S20'表示20個字符的字符串。如果它太低,您的號碼將獲得切碎:

>>> np.asarray([123], dtype='|S2') 
array(['12'], 
    dtype='|S2') 

另一種選擇,從我有限的測試是比較慢,但給你更多的控制和斬波問題將使用np.char.mod,就像沒有

# Column of row titles 
rows = np.array(['row1', 'row2', 'row3'])[:, np.newaxis] 
str_data = np.char.mod("%10.6f", data) 
with open('test.csv', 'w') as f: 
    np.savetxt(f, np.hstack((rows, str_data)), delimiter=', ', fmt='%s') 
+0

使用hstack必須在內存中重新創建數組,雖然,對吧?所以如果數據非常大,那麼我們必須重新分配這個內存。對於我的具體應用,這不太可能是真正的問題,但只是一個值得一提的問題。而且這可能沒有任何辦法。看起來像savetxt應該在內部實現,即使它必須做類似於我的解決方案(但在底層C代碼中)。 – 2012-03-29 21:34:29

+0

是的,你說得對。我認爲也許所有這些開銷都可以用記錄數組來避免,並且使用fmt接受格式化運算符列表的事實,例如'fmt = ['%s','%f',...]',但是我不熟悉它們,所以這只是一個猜測。 – jorgeca 2012-03-29 21:55:41

+0

雅,我也考慮過一個記錄陣列。我認爲你是對的,可以使用它......但我希望避免它們......我想我會選擇哪個似乎是兩個惡魔中較小的一個。 – 2012-03-29 23:07:39

相關問題