h5py 사용법 HDF5 예제
h5py 패키지는 Python에서 HDF5 바이너리 데이터 포맷을 사용하기 위한 인터페이스 패키지입니다. H5F5 포맷은 많은 양의 데이터를 카테고리 또는 속성별로 데이터를 나눠서 저장 할 수 있을 뿐만 아니라 numpy를 이용하여 데이터에 접근하여 사용할 수 있습니다.
이 글에서 사용된 전체 예제 소스코드는 아래의 명령어로 다운 받으실 수 있습니다.
$ git clone https://hiseon.me/reps/python-h5py-example.git
h5py 설치
conda 와 pip 명령어를 이용하여 h5py 패키지를 설치하는 방법입니다.
conda 명령어
아나콘다의 conda 를 사용할 경우 아래의 명령어를 이용하여 h5py 패키지를 설치 할 수 있습니다. 아나콘다가 설치되지 않았을 경우, 먼저 아래의 글을 이용하여 아나콘다를 설치 한 뒤에 다음 명령어를 실행해 주시기 바랍니다.
$ conda install h5py
pip 명령어
conda 명령어와 비슷하게 pip 를 이용하여 h5py를 설치 하실 수도 있습니다.
$ pip install h5py
HDF5 구성
HDF5 파일은 object 형태의 데이터셋 또는 다른 그룹들을 포함하는 그룹으로 구성됩니다. 그리고 object 의 메타 데이터를 저장할 수 있는 attrs 으로 구성됩니다.
간단히 비유를 하여 설명하면 그룹은 디렉터리로 비유할 수 있고, 데이터셋은 numpy 배열로 생각하시면 됩니다.
h5py 사용법
hy5py 패키지를 이용하여, hdf5 파일을 작성하고 참조하는 방법에 대해서 설명드리도록 하겠습니다. 먼저 아래의 코드를 이용하여 File 객체를 생성합니다.
import h5py
import numpy as np
f = h5py.File('test.hdf5', 'w')
생성된 HDF5 파일을 단순히 참조만 할 경우 File 객체를 생성할 때에 ‘w’ 옵션 대신에 ‘r’ 옵션을 사용하면 됩니다.
그룹 생성
먼저 아래의 코드를 이용하여 데이터가 저장될 그룹 group을 생성해 보도록 하겠습니다. 그룹을 생성하기 위해서는 create_group 함수를 사용합니다. 생성된 그룹에 추가로 하위 그룹을 생성할 수도 있습니다.
g = f.create_group("group")
sub = g.create_group("sub")
print (f.keys())
print (g.keys())
[u'group']
[u'sub']
그룹 속성 추가
생성된 그룹에 아래와 같이 속성을 추가할 수 있습니다.
sub.attrs['desc'] = "hello, world"
print (sub.attrs['desc'])
hello, world
데이터셋 추가
생성된 그룹에 데이터셋을 추가하기 위해서는 create_dataset 이라는 함수를 사용하거나, 직접 데이터를 지정하면서 데이터셋을 저장할 수 있습니다.
그리고 데이터셋에서 데이터를 참조하는 방법은 아래와 같습니다.
a = sub.create_dataset("a", data = np.arange(20))
b = sub['b'] = np.arange(10)
print (sub.keys())
for k in sub.keys():
dataset = sub[k]
print (dataset)
print (dataset.dtype)
print (dataset[()])
[u'a', u'b']
<HDF5 dataset "a": shape (20,), type "<i8">
int64
[ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19]
<HDF5 dataset "b": shape (10,), type "<i8">
int64
[0 1 2 3 4 5 6 7 8 9]
데이터셋 참조
File 객체에서 바로 구분자를 사용하에 데이터셋 또는 그룹에 접근할 수 있습니다.
b = f[u'/group/sub/b']
print (b)
<HDF5 dataset "b": shape (10,), type "<i8">
이외의 추가적인 h5py 패키지 사용방법에 대해서는 아래의 페이지를 참고해 주시기 바랍니다.
http://docs.h5py.org/en/stable/quick.html
( 본문 인용시 출처를 밝혀 주시면 감사하겠습니다.)