【问题标题】:Fastest way to create a numpy array from text file从文本文件创建 numpy 数组的最快方法
【发布时间】:2015-08-20 19:28:42
【问题描述】:

我有 60mb 的文件,里面有很多行。

每一行的格式如下:

(x,y)

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

最后它应该在 shpae (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

【问题讨论】:

  • 绝对这样做:points = np.vstack((points, point))。这导致points 被复制到每个新行。相反,将 points 设为 python 列表,并附加到它。在读完文件之前不要将其转换为 numpy 数组。
  • 如果你可以改变文件的格式,去掉括号。这些在文本文件中是不常见的,需要特殊处理。 (当然,如果您可以控制格式,并且关心性能,则应该考虑二进制格式而不是文本。)
  • @member555:见Numpy documentation on input and output。第一个例程处理 Numpy 的自定义二进制格式(.npy 和 .npz 文件),但也有读取原始二进制文件的例程。
  • @member555 this question is much related,您可以从中获得一些见解。我发现最好的方法是创建一个临时数组并在您浏览文件时填充它。
  • @member555:不,实际上你没有。数据从何而来?它必须由其他程序编写。如果其他程序是用 Python 编写的,它可以以 .npy 格式写入数据。如果它使用不同的编程语言,您可以编写原始二进制文件,或者使用更便携的格式,例如 netCDFHDF5

标签: python arrays performance numpy


【解决方案1】:

可以提高速度的一件事是模仿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() - 如果我们不需要,最好不要从输入文件执行任意代码。
猜你喜欢
  • 1970-01-01
  • 2014-06-28
  • 2017-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多