【问题标题】:Numpy array from file- preallocating?来自文件预分配的 Numpy 数组?
【发布时间】:2011-09-30 18:40:02
【问题描述】:

我有一组大型 ascii 数据文件,我需要将它们放入一个 numpy 数组中。大体上,我的意思是 390 行,其中每行是 60,000 个值(从 C++ 程序以高精度输出的双精度值),以空格分隔。

目前我正在使用以下(天真的)代码:

import numpy as np
data_array = np.genfromtxt('l_sim_s_data.txt')

但是,这需要 25 秒以上的时间才能运行。我怀疑这是由于在读取值之前没有预先分配 data_array。有没有办法告诉 genfromtxt 它正在制作的数组的大小(所以内存会被预先分配)?或者有没有人知道如何加快这个过程?

【问题讨论】:

  • 不管它值多少钱,如果你给它一个 count 参数,np.fromiter 将预先分配。您可以利用它来制作一个 np.loadtxt 等价物来预分配数组。

标签: python arrays performance numpy memory-management


【解决方案1】:

你试过np.loadtxt吗?

genfromtxt 是一个更高级的文件加载器,可以处理缺失值和格式转换器等问题。)

【讨论】:

  • 不知何故我昨天的评论没有出现。感谢您对 np.loadtxt 的建议。它确实有所作为,但没有我想要的那么大(np.genfromtxt 为 25 秒,np.loadtxt 为 20 秒)。在 C++ 中,使用预先分配的数组,我可以将读取时间缩短到一秒以下。如果在 python 中没有更好的方法,我将考虑制作一个基于 C++ 的 python 模块,专门用于将这些数据直接加载到 numpy 数组中。
  • @Mark:嗯。我已经在 numpy 文档中四处寻找,你是对的:加载到预先分配的数组中似乎确实很缺失。一个想法:您是否尝试过仅在纯 Python 中加载数组?像for line in file: data_array[i, :] = map(float, line.split()) 这样的东西。 IO 被大量缓冲,所以这实际上可能很快捷。
  • 感谢您的建议 - 它确实有很大的不同。使用循环加载文件大约需要 8-10 秒。不是 C++ 速度,但现在我们开始取得进展。 ;)
  • @Mark:您可以考虑使用类似scipy.weave.inline 的方式进行迭代,以避免必须制作 C++ 模块。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-07
  • 2014-11-12
  • 2020-04-22
  • 2014-12-05
  • 2019-06-13
  • 1970-01-01
相关资源
最近更新 更多