我已经从numpy数组创建了一个.h5。
h5f = h5py.File('/data/debo/jetAnomaly/AtlasData/dijets/mergedRoot/miniTrees/JZ3W.h5', 'w')
h5f.create_dataset('JZ3WPpxpypz', data=all, compression="gzip")HDF5数据集"JZ3WPpxpypz":shape (19494500,376),键入"f8“
但是,当我将.h5文件读取到numpy数组时,我得到了一个内存错误。
filename = '/data/debo/jetAnomaly/AtlasData/dijets/mergedRoot/miniTrees/JZ3W.h5'
h5 = h5py.File(filename,'r')
h5.keys()u'JZ3WPpxpypz‘
data = h5['JZ3WPpxpypz']如果我试图查看数组,它会给我内存错误。
data[:]
---------------------------------------------------------------------------
MemoryError Traceback (most recent call last)
<ipython-input-33-629f56f97409> in <module>()
----> 1 data[:]
h5py/_objects.pyx in h5py._objects.with_phil.wrapper()
h5py/_objects.pyx in h5py._objects.with_phil.wrapper()
/home/debo/env_autoencoder/local/lib/python2.7/site-packages/h5py/_hl/dataset.pyc in __getitem__(self, args)
560 single_element = selection.mshape == ()
561 mshape = (1,) if single_element else selection.mshape
--> 562 arr = numpy.ndarray(mshape, new_dtype, order='C')
563
564 # HDF5 has a bug where if the memory shape has a different rank
MemoryError: 是否有任何有效的内存方法将.h5文件读取到numpy数组中?
谢谢,德博。
发布于 2019-11-24 16:56:23
您不需要调用numpy.ndarray()来获得数组。试试这个:
arr = h5['JZ3WPpxpypz'][()]
# or
arr = data[()]添加[()]返回整个数组(与data变量不同--它只是引用HDF5数据集)。任何一种方法都应该为您提供一个与原始数组相同的dtype和形状数组。还可以使用numpy切片操作来获取数组的子集。
有必要作出澄清。我忽略了调用numpy.ndarray()作为打印data[()]的过程的一部分。下面是类型检查,以显示与2个调用的返回值之间的差异:
# check type for each variable:
data = h5['JZ3WPpxpypz']
print (type(data))
# versus
arr = data[()]
print (type(arr))输出将如下所示:
<class 'h5py._hl.dataset.Dataset'>
<class 'numpy.ndarray'>通常,h5py数据集行为与numpy数组类似(按设计)。然而,它们是不一样的。当您尝试使用此调用(data[()])打印数据集内容时,h5py试图使用numpy.ndarray()将数据集转换为背景中的numpy数组。如果您有更小的数据集或足够的内存,它就能工作。
我的理解是:调用arr = h5['JZ3WPpxpypz'][()]创建不调用numpy.ndarray()的进程的numpy数组。
当您有非常大的数据集时,可能会遇到无法使用arr= h5f['dataset'][()]创建数组的情况,因为数据集太大,无法作为numpy数组放入内存中。当发生这种情况时,您可以创建h5py dataset对象,然后使用切片表示法访问数据的子集,如下面这个简单的示例:
data = h5['JZ3WPpxpypz']
arr1 = data[0:100000]
arr2 = data[100000:200000])
# etchttps://stackoverflow.com/questions/59018887
复制相似问题