2012-08-31 60 views
0

我想这样的:格式化NumPy的阵列

 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”也造成问题,因为它不是浮动。

我可以格式化它们,将它们全部转换为字符串,然后合并,然后savetxt?

回答

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=",") 
+0

有没有办法我只能让我第一个%,然后连续的一%10.6e?问题是数组可以是可变大小。 –

+0

编辑给你一个格式字符串的例子... –

+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')