使用开始/结束标记读取结构化数据

时间:2018-05-19 14:16:01

标签: python numpy io genfromtxt

我的数据文件部分看起来像

START
vertex 266.36 234.594 14.6145
vertex 268.582 234.968 15.6956
vertex 267.689 232.646 15.7283
END
START
vertex 166.36 23.594 4.6145
vertex 8.582 23.968 5.6956
vertex 67.689 32.646 1.7283
END
# [...]

,即三个“顶点”的块。我现在想尽快读取数据。到目前为止,我一个接一个地走过这条线,

data = numpy.empty((n, 3))

flt = numpy.vectorize(float)
for k in range(n):
    parts = f.readline().decode('utf-8').split()
    assert len(parts) == 4
    assert parts[0] == 'vertex'
    data[k] = flt(parts[1:])

但这很慢。

任何提示?

2 个答案:

答案 0 :(得分:1)

假设您刚刚使用了START行,您可以尝试类似

的内容
>>> i = iter(file.__next__, 'END\n')
>>> np.loadtxt(i, usecols=(1,2,3))
array([[266.36  , 234.594 ,  14.6145],
       [268.582 , 234.968 ,  15.6956],
       [267.689 , 232.646 ,  15.7283]])

我假设loadtxt速度相当快,但我不知道iter的开销是多少。

答案 1 :(得分:0)

首先,为什么需要从utf-8解码?您显示的数据暗示可能不需要。

想到的第二个想法是最后一行的数组切片。既然您已经检查过正好有4个项目,您打算跳过第一个项目,具体取决于numpy的工作方式,可以选择说:

data[k] = (float(parts[1]), float(parts[2]), float(parts[3]))