I am trying to use python slice objects to access data from an HDF5 file using the h5py module. I put together this example to show that it works with numpy arrays, but not with 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()
This gives the following output:
[[ 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)
Does anyone know if this is just not possible with h5py? If it is not, is there an alternative way to slice in h5py, using objects or variables, instead of explicitly typing the slice like f['data'][0:3,2:5] as in my example?
Playing around with your example:
So it looks like
h5pyarrays can use slices, but cannot split a list into its elements. But it does take a tuple. My guess is that there is minor difference in howgetitemis implemented.You are doing advanced indexing.
numpydoc says:h5pymay not be doing this promoting to tuple. Otherwise it appears to do advance indexing just fine.