2012-08-31 138 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')