<p>最简单的是使用HDF5数据集的<code>.value</code>属性。</p>
<pre><code>>>> hf = h5py.File('/path/to/file', 'r')
>>> data = hf.get('dataset_name').value # `data` is now an ndarray.
</code></pre>
<p>您还可以对数据集进行切片,从而使用请求的数据生成实际的ndarray:</p>
<pre><code>>>> hf['dataset_name'][:10] # produces ndarray as well
</code></pre>
<p>但请记住,在许多方面,<code>h5py</code>数据集的行为类似于<code>ndarray</code>。因此,可以将数据集本身不变地传递给大多数(如果不是全部)NumPy函数。所以,例如,这工作得很好:<code>np.mean(hf.get('dataset_name'))</code>。</p>
<p><strong>编辑:</strong></p>
<p>我最初误解了这个问题。问题不是加载数值数据,而是数据集实际上包含</em>HDF5引用。这是一个奇怪的设置,读入<code>h5py</code>有点尴尬。您需要取消对数据集中每个引用的引用。我只给他们一个人看。</p>
<p>首先,我们创建一个文件和一个临时数据集:</p>
<pre><code>>>> f = h5py.File('tmp.h5', 'w')
>>> ds = f.create_dataset('data', data=np.zeros(10,))
</code></pre>
<p>接下来,创建对它的引用并将其中一些存储在数据集中。</p>
<pre><code>>>> ref_dtype = h5py.special_dtype(ref=h5py.Reference)
>>> ref_ds = f.create_dataset('data_refs', data=(ds.ref, ds.ref), dtype=ref_dtype)
</code></pre>
<p>然后,您可以以迂回的方式读回其中一个,方法是获取其名称,然后从被引用的实际数据集中读取。</p>
<pre><code>>>> name = h5py.h5r.get_name(ref_ds[0], f.id) # 2nd argument is the file identifier
>>> print(name)
b'/data'
>>> out = f[name]
>>> print(out.shape)
(10,)
</code></pre>
<p>它是圆形的,但似乎有效。TL;DR is:获取被引用数据集的名称,并直接从中读取。</p>
<p><strong>注意:</strong></p>
<p>尽管有这个名字,<code>h5py.h5r.dereference</code>函数在这里似乎很没用。它返回被引用对象的ID。这可以直接从中读取,但在这种情况下,很容易导致崩溃(在这个人为的例子中,我做了好几次)。从中得到名字和阅读要容易得多。</p>