2013-12-11 8 views
2

h5py 모듈을 사용하여 HDF5 파일의 데이터에 액세스하기 위해 Python 슬라이스 객체를 사용하려고합니다. 이 예제를 함께 사용하여 numpy 배열과 함께 작동하지만, h5py으로 작동하지 않는다는 것을 보여줍니다.h5py로 HDF5 파일을 읽을 때 파이썬 슬라이스 객체를 사용합니까?

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() 

이 다음과 같은 출력 제공 :이 h5py하지 만 가능한 경우

[[ 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) 

사람이 알고 있나요을? 그렇지 않다면 구체 예 대신 f['data'][0:3,2:5]과 같이 슬라이스를 입력하는 대신 객체 또는 변수를 사용하여 h5py으로 슬라이스 할 수있는 다른 방법이 있습니까?

답변

4

귀하의 예제와 주변 재생 : h5py 배열 슬라이스를 사용할 수 있지만, 그 요소로 목록을 분할 할 수있는 것처럼

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 

그래서 그것은 본다. 그러나 튜플을 필요로합니다. 내 생각에 getitem이 구현되는 방식에는 사소한 차이가 있습니다.

고급 인덱싱을 수행하고 있습니다. numpy 문서는 말한다 :

고급 인덱싱 선택 객체가 튜플하지 않을 때 선택 개체, OBJ, ... 적어도 하나의 시퀀스 객체 튜플이 .... 이,이 언급 될 때 트리거됩니다 마치 하나의 튜플로 승격 된 것처럼 선택 튜플이라고 부릅니다.

h5py 튜플을 승격시키지 않을 수 있습니다. 그렇지 않으면 사전 인덱싱을 잘 수행하는 것처럼 보입니다.