我想要这个:
SP,1,2,3
1,1.000000e+00,2.000000e+00,3.000000e+00
2,1.630000e+01,1.990000e+01,1.840000e+01
3,1.630000e+01,1.990000e+01,1.840000e+01
4,1.630000e+01,1.990000e+01,1.840000e+01
我有以下代码:
np.savetxt("Final Array.csv", my_array, fmt="%10.6e", delimiter=',')
它产生:
1.000000e+00,2.000000e+00,3.000000e+00
1.630000e+01,1.990000e+01,1.840000e+01
1.630000e+01,1.990000e+01,1.840000e+01
1.630000e+01,1.990000e+01,1.840000e+01
我已经为顶行和左列创建了数组。
如何对此进行格式设置,以便在保留最左侧列的同时保持数字格式正确,并且顶行保持格式化原样?
我正在使用vstack和hstack来组合这些,但“SP”也会导致问题,因为它不是浮点数。
我可以格式化它们,将它们全部转换为字符串,合并然后保存文本吗?
答案 0 :(得分:2)
如下:
from cStringIO import StringIO
from itertools import izip
# savetxt into a string
sio = StringIO()
np.savetxt(sio, my_array, fmt="%10.6e", delimeter=',')
data_lines = sio.getvalue().split('\n')
with open('Final Array.csv', 'w') as f:
f.write(header_string + '\n')
for leftcol, main in izip(left_column, data_lines):
f.write(leftcol + ',' + main)
或者在没有savetxt
的情况下这样做:
with open('Final Array.csv', 'w') as f:
f.write(header_string + '\n')
for label, row in izip(left_column, my_array):
f.write(str(label) + ',' + ','.join('%10.6e' % x for x in row) + '\n')
答案 1 :(得分:2)
一个简单的解决方案需要创建一个与my_array
长度相同的临时数组和一个额外的列。
temp = np.empty((my_array.shape[0], my_array.shape[1]+1))
然后,用你想要的索引填充第一列,用你的初始数组填充最后一列:
temp[:,1:] = my_array
temp[:,0] = np.arange(1, len(my_array)+1)
为了编写标题,您必须先写入文件。您仍然可以将文件对象传递给np.savetxt
,您只需修改格式字符串,以便第一列写为int
,其他列为"%10.6e"
:
with open('final.csv', 'w') as f:
f.write("SP,1,2,3\n")
np.savetxt(f, temp, fmt="%i,%10.6e,%10.6e,%10.6e",delimiter=",")
定义格式字符串的更具交互性的方式,具体取决于my_array
的列数
fmt = ",".join(["%i"] + ["%10.6e"] * my_array.shape[1])
np.savetxt(f, temp, fmt=fmt, delimiter=",")