2017-08-05 93 views
2

我的文件看起來如下,其中每行的前3個數字表示的事物三角形/三重,和第4號是每個三角形標記:快速將一個非常大的數字字符串列表到ndarray

import numpy as np 
file = open(fname, 'r') 
lines = [x for x in file.readlines() if not x.startswith('#')] 

n = ... # number of lines to read 
tri = np.empty([n, 3], dtype=int) # array of triplets 
tri_mark = np.empty([n], dtype=int) # a marker for each triplet 
for i in range(n): 
    s = lines[i].split() 
    tri[i, :] = [int(v) for v in s[ : -1]] 
    tri_mark[i] = int(s[-1]) 

當行數進入千家萬戶,事實證明,for循環是一個令人難以置信的瓶頸:

1 2 3 1 
5 6 7 0 
300 10 11 5 
0 14 15 9 

我現在如下讀它。我觀察到一個我也使用的外部程序可以很快讀取文件,所以我認爲應該可以更快地讀取和轉換。

有沒有辦法更快地將字符串列表轉換爲ndarray

(轉換爲二進制文件目前不是一個選項。)

回答

3

使用np.loadtxt在整個文件中讀取:

>>> import numpy as np 
>>> arr = np.loadtxt(fname, dtype=int) 
>>> arr 
array([[ 1, 2, 3, 1], 
     [ 5, 6, 7, 0], 
     [300, 10, 11, 5], 
     [ 0, 14, 15, 9]]) 

,然後切片,以獲得相應的子陣:

>>> tri = arr[:, 0:3] 
>>> tri 
array([[ 1, 2, 3], 
     [ 5, 6, 7], 
     [300, 10, 11], 
     [ 0, 14, 15]]) 
>>> tri_mark = arr[:, 3] 
>>> tri_mark 
array([1, 0, 5, 9]) 
相關問題