从文本文件创建numpy数组的最快方法

3

我有一个大小为60MB的文件,里面有很多行。

每一行的格式如下:

(x,y)

每一行都将被解析为形状为(1,2)的numpy向量。

最终应该将它们连接成一个形状为(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

3
千万不要这样做:points = np.vstack((points, point))。这会导致每添加一行就复制一次points。相反,将points定义为Python列表,并向其中添加元素。在读完文件之前不要将其转换为NumPy数组。 - Warren Weckesser
3
如果您可以更改文件格式,请删除括号。在文本文件中,这些括号是不寻常的,需要特殊处理。(当然,如果您对格式具有控制权并且关心性能,应考虑使用二进制格式而不是文本格式。) - Warren Weckesser
1
@member555:请查看Numpy输入输出文档。第一组例程处理Numpy的自定义二进制格式(.npy和.npz文件),但也有用于读取原始二进制文件的例程。 - Sven Marnach
2
@member555 这个问题有很大的关联,你可以从中获取一些见解。我发现最好的方法是创建一个临时数组,并在遍历文件时填充它。 - Saullo G. P. Castro
1
@member555:不,实际上你不需要这样做。数据从哪里来?它必须由其他程序编写。如果该程序是用Python编写的,则可以将数据以.npy格式编写。如果使用的是不同的编程语言,则可以编写原始二进制文件,或者使用更便携的格式,如netCDFHDF5 - Sven Marnach
显示剩余7条评论
1个回答

2

提高速度的一种方法是模仿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阅读器,但我不知道是否可以配置来处理这种格式。


如果可以的话,最好不要从输入文件中执行任意代码,而是使用用户ast.literal_eval() - Sven Marnach

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接