在磁盘上保留numpy阵列的最佳方法

我正在寻找一种保存大型numpy阵列的快速方法。我想以二进制格式将它们保存到磁盘上,然后相对快速地将它们读回内存。不幸的是,cPickle不够快

我找到了numpy.savez和numpy.load。但奇怪的是,numpy.load将npy文件加载到“内存映射”中。这意味着数组的常规操作非常缓慢。例如,像这样的事情会非常缓慢:

#/usr/bin/python
输入numpy作为np;
导入时间;
从临时文件导入临时文件
n=10000000;
a=np.arange(n)
b=np.arange(n)*10
c=np.arange(n)*-0.5
file=临时文件()
np.savez(文件,a=a,b=b,c=c);
file.seek(0)
t=time.time()
z=np.load(文件)
打印“加载时间=,time.time()-t
t=time.time()
aa=z['a']
bb=z['b']
cc=z['c']
打印“分配时间=”,time.time()-t;

更准确地说,第一行速度非常快,但将数组分配给obj的其余行速度慢得可笑:

加载时间=0.000220775604248
辅助时间=2.72940087318

有没有更好的方法来保存numpy数组?理想情况下,我希望能够在一个文件中存储多个数组

我比较了存储numpy阵列的多种方法的性能(空间和时间)。它们中很少有支持每个文件有多个数组,但无论如何,它可能还是有用的

Npy和二进制文件对于密集数据来说都非常快速和小。如果数据是稀疏的或非常结构化的,您可能希望使用npz进行压缩,这将节省大量空间,但会花费一些加载时间

如果可移植性是一个问题,二进制比npy更好。如果人的可读性很重要,那么您将不得不牺牲大量的性能,但是使用csv可以很好地实现这一点(当然,csv也是非常可移植的)

更多详细信息和代码可在github repo上获得

发表评论