Python 快速将大量字符串列表转换为ndarray

Python 快速将大量字符串列表转换为ndarray,python,arrays,performance,numpy,file-io,Python,Arrays,Performance,Numpy,File Io,我的文件如下所示,其中每行前3个数字表示三角形/三元组,第4个数字是每个三角形的标记: 1 2 3 1 5 6 7 0 300 10 11 5 0 14 15 9 我目前阅读的内容如下: 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

我的文件如下所示,其中每行前3个数字表示三角形/三元组,第4个数字是每个三角形的标记:

1 2 3 1
5 6 7 0
300 10 11 5
0 14 15 9
我目前阅读的内容如下:

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循环是一个令人难以置信的瓶颈。我观察到,我也使用的外部程序可以非常快速地读取文件,因此我认为读取和转换速度应该更快

有没有办法更快地将字符串列表转换为
ndarray

(当前不允许切换到二进制文件。)

用于读取整个文件:

>>> 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])