Python/Numpy - 使用列和行标题保存数组

Sco*_*t B 8 python numpy export-to-csv

我想将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())
Run Code Online (Sandbox Code Playgroud)

jor*_*eca 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')
Run Code Online (Sandbox Code Playgroud)

这是隐式转换data为字符串数组,对于我的计算机中的每百万个项目大约需要200毫秒.

dtype '|S20'表示20个字符的字符串.如果它太低,你的号码就会被砍掉:

>>> np.asarray([123], dtype='|S2')
array(['12'], 
  dtype='|S2')
Run Code Online (Sandbox Code Playgroud)

另一种选择,从我的有限测试来看是慢的,但是给你更多的控制并且没有使用的切碎问题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')
Run Code Online (Sandbox Code Playgroud)