8

我想将二维数组保存到包含行和列“标题”信息(如表格)的 CSV 文件中。我知道我可以使用 numpy.savetxt 的 header 参数来保存列名,但是有没有简单的方法可以将一些其他数组(或列表)也包含为数据的第一列(如行标题)?

下面是我目前如何做的一个例子。有没有更好的方法来包含这些行标题,也许是我不知道的 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())
4

1 回答 1

7

也许你更愿意做这样的事情:

# 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'表示二十个字符的字符串。如果它太低,你的数字会被砍掉:

>>> 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')
于 2012-03-29T16:50:19.550 回答