2014-03-26 121 views
2

考慮有幾個相當長numpy的數組:Python列表類的字符串表示

importy numpy as np; 
long_array1 = np.array([random.random() for i in range(10000)]); 
long_array2 = np.array([random.random() for i in range(10000)]); 
long_array3 = np.array([random.random() for i in range(10000)]); 

我想數組保存到文件file.dat,每numpy的陣列一行。 數組的文本表示應在一個python陣列樣形式,即,在以下numpy的陣列的情況下:

a = np.array([0.3213,0.145323,0.852,0.723,0.421452]) 

我想保存下列文件中的行。

[0.3213,0.145323,0.852,0.723,0.421452] 

有我做的:

array1_str = ",".join([str(item) for item in long_array1]); 
array2_str = ",".join([str(item) for item in long_array2]); 
array3_str = ",".join([str(item) for item in long_array3]); 

with open("file.dat","w") as file_arrays: 
    file_arrays.write("[" + array1_str + "]\n"); 
    file_arrays.write("[" + array2_str + "]\n"); 
    file_arrays.write("[" + array3_str + "]\n"); 

一切正常,其實。我只是懷疑我的代碼的效率。我幾乎肯定必須有另一種(更好,更高效)的方式來做到這一點。 我歡迎對隨機列表生成的評論。

+0

你想要解決什麼問題?什麼是閱讀這些文件? – SingleNegationElimination

+0

我將在稍後分析數據 - 繪製圖表,計算概率等。問題是已經有幾個模塊使用指定的格式,所以我想保持相同的格式,以便於以下處理。不過,你推薦哪種格式(供我未來使用)? CSV格式可能是最好的一般兼容性。但是,有什麼格式建議在Python中使用(由python寫入文件,由python讀取,由python處理...)? – Marek

+0

另外:你通常會寫'np.random.random(10000)',而不是在列表理解中調用Python的標準隨機函數,然後調用'np.array'。它既短又快。 – DSM

回答

4

這是最快的方法:

','.join(map(str, long_array1.tolist())) 

如果你想保持文本更加緊湊​​,這是太快太:

','.join(map(lambda x: '%.7g' % x, long_array1.tolist())) 

來源:我爲基準此每一個可能的方法爲pycollada圖書館的維護者。

2

既然你想要一個類似Python的列表格式,那麼實際使用Python列表格式呢?

array1_str = repr(list(long_array1)) 

這是要留大多是在C-土地和性能都要好得多。

如果你不希望的空間,帶着他們出去後:

array1_str = repr(list(long_array1)).translate(None, " ") 

內存使用量可能是一個問題,但是。

0

聽起來像你可能可以使用numpy.savetxt()這個;

類似:

def dump_array(outfile, arraylike): 
    outfile.write('[') 
    numpy.savetxt(outfile, arraylike, newline=',', fmt="%s") 
    outfile.write(']\n') 

雖然我不認爲相應的numpy.loadtxt()將能夠在這種格式閱讀。