2017-08-05 92 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]) 
相关问题