2013-12-11 45 views
2

我正在嘗試使用h5py模塊使用python slice對象訪問HDF5文件中的數據。我把這個例子放在一起,表明它可以與numpy數組一起使用,但不能和h5py一起使用。使用h5py讀取HDF5文件時使用python slice對象?

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]這樣的分片?

回答

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醫生說:

當選擇對象obj,...有至少一個序列對象的元組.... 在選擇對象不是一個元組,它會被稱爲

高級索引被觸發好像它已被提升爲一個元組,這將被稱爲選擇元組。

h5py可能不會對元組進行這種提升。否則,它似乎做提前索引就好了。