2015-08-20 53 views
1

我有60mb的文件有很多行。從文本文件中創建numpy數組的最快方法

的每一行都具有以下格式:

(x,y) 

每條線將被解析爲以形狀(1,2)一個numpy的載體。

最後,它應該在shpae(N,2) 處連接成一個大的numpy數組,其中N是行數。

什麼是最快的方法呢?因爲現在需要很多時間(超過30分鐘)。

我的代碼:

with open(fname) as f: 
for line in f: 
    point = parse_vector_string_to_array(line) 
    if points is None: 
     points = point 
    else: 
     points = np.vstack((points, point)) 

當分析器:

會提高速度
def parse_vector_string_to_array(string): 
    x, y =eval(string) 
    array = np.array([[x, y]]) 
    return array 
+0

你看過實際的['numpy.loadtxt'](https://docs.scipy.org/doc/numpy/reference/generated/numpy.loadtxt.html)函數嗎?這正是它所寫的。 – CoryKramer

+0

@CoryKramer它期望的文本格式是什麼?我應該改變它嗎?4 – member555

+3

絕對不*做這個:'points = np.vstack((points,point))''。這會導致每個新行都複製'points'。相反,使'points'成爲一個python列表,並追加到它。在完成讀取文件之前,不要將其轉換爲numpy數組。 –

回答

1

一件事是模仿genfromtxt和積累每一行列表(或元組)的列表。然後在最後做一個np.array

例如(大約):

points = [] 
for line in file: 
    x,y = eval(line) 
    points.append((x,y)) 
result = np.array(points) 

由於您的文件線條看起來像元組,我會離開你的eval解析。我們通常不推薦eval,但在這個有限的情況下,它可能是最簡單的。

您可以嘗試使genfromtxt閱讀此內容,但每行上的()會帶來一些麻煩。

pandas應該有一個更快的csv閱讀器,但我不知道它是否可以配置爲處理此格式或現在。

+0

如果有什麼,用戶'ast.literal_eval()' - 最好不要從輸入文件執行任意代碼if我們不需要。 –

相關問題