0

我要这个:

        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”也引起了问题,因为它不是浮点数。

我可以格式化它们,将其全部转换为字符串,组合然后保存txt吗?

4

2 回答 2

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')
于 2012-08-31T16:18:10.373 回答
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=",")
于 2012-08-31T16:18:19.250 回答