我已经从numpy数组创建了.h5
class Foo
{
public string Name { get; set; }
public bool HasName => !String.IsNullOrEmpty(Name); ////assume you want empty to be treated same way as null
public void NameToUpperCase()
{
if (HasName)
{
Name = Name.ToUpper();
}
}
}
HDF5数据集“ JZ3WPpxpypz”:形状(19494500,376),键入“ f8”
但是在将.h5文件读取到numpy数组时遇到内存错误
h5f = h5py.File('/data/debo/jetAnomaly/AtlasData/dijets/mergedRoot/miniTrees/JZ3W.h5', 'w')
h5f.create_dataset('JZ3WPpxpypz', data=all, compression="gzip")
[u'JZ3WPpxpypz']
filename = '/data/debo/jetAnomaly/AtlasData/dijets/mergedRoot/miniTrees/JZ3W.h5'
h5 = h5py.File(filename,'r')
h5.keys()
如果我尝试查看数组,则会给我内存错误
data = h5['JZ3WPpxpypz']
是否有任何有效的内存方式将.h5文件读入numpy数组?
谢谢, 德波。
答案 0 :(得分:0)
您无需调用problem = ProblemSIRD(bjorgvin, alpha, beta, gamma)
即可获取数组。
试试这个:
numpy.ndarray()
添加arr = h5['JZ3WPpxpypz'][:]
# or
arr = data[:]
返回数组(与您的[:]
变量不同-它仅引用HDF5数据集)。两种方法都应为您提供与原始数组相同的dtype和形状的数组。您还可以使用numpy切片操作来获取数组的子集。
需要澄清。我忽略了data
被作为打印numpy.ndarray()
的过程的一部分。
以下是类型检查,以显示两次调用的收益差异:
data[:]
输出将如下所示:
# check type for each variable:
data = h5['JZ3WPpxpypz']
print (type(data))
# versus
arr = data[:]
print (type(arr))
通常,h5py数据集的行为类似于numpy数组(根据设计)。 但是,它们并不相同。当您尝试通过此调用(<class 'h5py._hl.dataset.Dataset'>
<class 'numpy.ndarray'>
打印数据集内容时,h5py尝试使用data[:]
在后台将数据集转换为numpy数组。如果您有一个较小的数据集或足够的内存,它会起作用。
我的要点:调用numpy.ndarray()
会创建一个不调用arr = h5['JZ3WPpxpypz'][:]
的进程的numpy数组。
当数据集非常大时,您可能会遇到无法使用numpy.ndarray()
创建数组的情况,因为数据集太大而无法作为numpy数组放入内存。发生这种情况时,您可以创建h5py数据集对象,然后使用切片符号访问数据的子集,例如以下简单示例:
arr= h5f['dataset'][:]