高效地调整Numpy或数据集大小的方法是什么?

4
我想了解 resize() 函数在numpy数组和h5py dataset上的效果。在我的应用中,我逐行读取文本文件,然后在解析数据后写入一个hdf5文件。实现这个功能的好方法是什么?我应该将每一行新数据添加到numpy数组中,并保持调整大小(增加轴)来调整numpy数组(最终将完整的numpy数组写入h5py数据集),还是直接将每一行新数据添加到h5py dataset中,从而在内存中调整h5py dataset的大小。如果我们在每行后都保持调整大小,resize()函数会如何影响性能?或者我应该在每100或1000行后调整大小?
每个数据集中可能有大约200,000行。
感谢任何帮助。

不了解h5py的人,您能否评论一下每次添加新行后调整大小的numpy性能? - Alok
为什么不一开始就使用 np.fromfile 将整个文件读入numpy数组呢?这样你的速度会更快... - mgilson
文本文件是一种原始数据,我需要解析并转换成特定格式。文件大小约为2GB。我正在逐字节处理数据。 - Alok
2个回答

3

我认为resize()函数将会复制数组中的所有数据,如果你不断地调用它,那么速度就会变得很慢。

如果你想不断地将数据追加到数组中,可以先创建一个大数组,然后使用索引将数据复制到其中。

或者你可以使用array模块中的数组对象,这是一个行为类似于列表的动态数组。将所有数据追加到数组对象后,可以将其转换为ndarray。下面是一个示例:

import array
import numpy as np
a = array.array("d")
a.extend([0,1,2])
a.extend([3,4,5])
b = np.frombuffer(a, np.float).reshape(-1, 3)

2

NumPy数组不是为了调整大小而设计的。虽然可以做到,但从内存的角度来看是浪费的(因为您需要创建一个比第一个数组大的第二个数组,然后用数据填充它...这是您必须保留的两个数组),当然还有时间方面的浪费(创建临时数组)。 最好从列表(或常规数组,如@HYRY建议的那样)开始,然后在块足够大时转换为ndarrays。 问题是,何时需要进行转换?


感谢@pierre。我已经实现了HYRY的解决方案。这个数组只存储转换后的数据。我需要将这些数据写入hdf5文件中。我猜这与hdf5文件类似,我不应该逐行写入数据。我将首先读取完整文件并将数据解析为数组对象,然后将该对象写入hdf5文件。谢谢。 - Alok

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