Python Numpy savez/加载数千个阵列,但不是一步完成的

Python Numpy savez/加载数千个阵列,但不是一步完成的,python,arrays,serialization,numpy,Python,Arrays,Serialization,Numpy,我想在一个序列化的未压缩文件(大约6 GB的数据)中存储大约4000个numpy阵列(每个阵列1.5 MB)。下面是一个具有2个小阵列的示例: import numpy d1 = { 'array1' : numpy.array([1,2,3,4]), 'array2': numpy.array([5,4,3,2]) } numpy.savez('myarrays', **d1) d2 = numpy.load('myarrays.npz') for k in d2: print d2

我想在一个序列化的未压缩文件(大约6 GB的数据)中存储大约4000个numpy阵列(每个阵列1.5 MB)。下面是一个具有2个小阵列的示例:

import numpy
d1 = { 'array1' : numpy.array([1,2,3,4]), 'array2': numpy.array([5,4,3,2]) }
numpy.savez('myarrays', **d1)

d2 = numpy.load('myarrays.npz')
for k in d2:
    print d2[k]
这是可行的,但我想做同样的事情,而不是一步到位:

  • 保存时,我希望能够保存10个数组,然后执行其他任务(可能需要几秒钟),然后写入100个其他数组,然后执行其他操作,然后写入其他50个数组,等等

  • 加载:idem时,我希望能够加载一些数组,然后执行其他任务,然后继续加载


如何处理这个
numpy.savez
/
numpy.load

我认为你不能用np.savez来处理这个问题。然而,这是hdf5的完美用例。请参见:

作为如何在h5py中执行此操作的示例:

h5f = h5py.File('test.h5', 'w')
h5f.create_dataset('array1', data=np.array([1,2,3,4]))
h5f.create_dataset('array2', data=np.array([5,4,3,2]))
h5f.close()

# Now open it back up and read data
h5f = h5py.File('test.h5', 'r')
a = h5f['array1'][:] 
b = h5f['array2'][:]
h5f.close()
print a
print b
# [1 2 3 4]
# [5 4 3 2]

当然还有更复杂的方法,通过组来组织数组,添加元数据,在hdf5文件中预先分配空间,然后再填充,等等。

savez
在当前的numpy中,只需使用
numpy.save
将数组写入临时文件,然后将它们添加到zip文件中(有或没有压缩)


如果你不使用压缩,你最好跳过第2步,一个接一个地保存你的数组,并将所有4000个数组保存在一个文件夹中。

太好了!我尝试了h5py,使用createdataset编写代码非常简单,但是你有没有一个如何读回数组的示例?给定
a=h5f['array1']
a
只是对数据集的引用。
a
实际上并没有将数据拉入内存。另一方面
a=h5f['array1'][:]
实际上是从h5文件中获取数据并将其加载到变量
a
。符号表示获取包含所有元素的数据片段。您也可以使用
[…]
或使用类似
[1:3]
的方法获取子集。感谢这些有用的信息!
a=h5f['array1']
就像一个指针,而
a=h5f['array1'][:]
实际上检索数据?这是一个普遍的规则,
[:]
真正复制到内存中吗?考虑一下:
a=np.arange(100);b=a[:];np.may\u共享内存(a,b)
返回
True
,因此在numpy中,无法保证使用该符号的副本,因为上面给出了一个视图。我目前正在进行一些分析测试,无法获得一致的结果(因为我认为Windows会对内存进行缓存):加载2 GB随机numpy数组时,我会得到20秒、27秒甚至38秒的值。
h5py
加载时间与
numpy.load
的速度效率相比如何?我能够使用“归档管理器”将
.npy
文件(数组)添加到
.npz
(并加载它)因此,可以保存多个“.npz”并合并它们(最糟糕的情况是将文件提取到临时目录)。