我想将2D数组保存为CSV文件,其中包含行和列“标题”信息(如表格)。我知道我可以使用numpy.savetxt的头参数来保存列名,但有没有简单的方法来包含一些其他数组(或列表)作为第一列数据(如行标题)?
下面是我目前如何做的一个例子。有没有更好的方法来包含那些行标题,也许是我不知道的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())
答案 0 :(得分: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')