使用Python的切片对象读取h5py文件时需要注意什么?

4

我正在尝试使用Python切片对象,利用h5py模块从HDF5文件中访问数据。我编写了这个示例来展示它可以与numpy数组一起使用,但无法与h5py一起使用。

import h5py
import numpy as np

slice_obj = [slice(None,3,None), slice(2,5,None)]

test_array = np.ones((3,5))
print test_array[0:3,2:5]
print test_array[slice_obj]

f = h5py.File("testing.hdf5","w")
f['data'] = test_array
f.close()

f = h5py.File("testing.hdf5","r")
test2 = f['data'][0:3,2:5]
print test2
test2 = f['data'][slice_obj]
print test2
f.close()

这将产生以下输出:
[[ 1.  1.  1.]
 [ 1.  1.  1.]
 [ 1.  1.  1.]]
[[ 1.  1.  1.]
 [ 1.  1.  1.]
 [ 1.  1.  1.]]
[[ 1.  1.  1.]
 [ 1.  1.  1.]
 [ 1.  1.  1.]]
Traceback (most recent call last):
  File "slice.py", line 17, in <module>
    test2 = f['data'][slice_obj]
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/h5py/_hl/dataset.py", line 439, in __getitem__
    self.id.read(mspace, fspace, arr, mtype)
  File "h5d.pyx", line 179, in h5py.h5d.DatasetID.read (h5py/h5d.c:2479)
  File "_proxy.pyx", line 118, in h5py._proxy.dset_rw (h5py/_proxy.c:1300)
  File "_proxy.pyx", line 84, in h5py._proxy.H5PY_H5Dread (h5py/_proxy.c:1051)
IOError: can't read data (Dataset: Read failed)

有人知道是否使用h5py无法实现这一点吗?如果不是,是否有其他的方式可以在h5py中进行切片,使用对象或变量,而不是像我的示例中那样明确地输入切片f['data'][0:3,2:5]

1个回答

5

尝试使用您的示例进行操作:

test2 = f['data']
print test2
print test2.shape
print test2[0:3,2:5]
print test2[slice(None,3,None),slice(2,5,None)]  # ok
print test2[slice_obj[0],slice_obj[1]]  # ok
print test2[tuple(slice_obj)]  # ok
print test2[[slice(None,3,None),slice(2,5,None)]]  # fail
print f['data'][tuple(slice_obj)] 3 ok

看起来数组可以使用切片,但不能将列表拆分为其元素。 但它确实需要一个元组。 我猜测在的实现方式上可能存在微小差异。
您正在进行高级索引。 文档说:
高级索引是在选择对象obj时触发的,...带有至少一个序列对象的元组.... 当选择对象不是元组时,它将被视为已升级为1元组,并将称为选择元组。 可能没有将其提升为元组。 否则,它似乎可以很好地完成高级索引。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接