我正在尝试使用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]
这样的切片?
答案 0 :(得分:4)
玩弄你的例子:
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
因此看起来h5py
数组可以使用切片,但不能将列表拆分为其元素。但确实需要一个元组。我的猜测是getitem
的实施方式存在细微差别。
您正在进行高级索引。 numpy
doc说:
当选择对象obj,......一个至少有一个序列对象的元组时,会触发高级索引.... 当选择对象不是元组时,它将被称为它被提升为1元组,这将被称为选择元组。
h5py
可能不会将此提升为元组。否则它似乎可以提前编制索引。