h5py에 대한 입력 및 출력 numpy 배열


100

출력이 여기에 이미지 설명 입력크기 가 지정된 행렬이고 항목이 모두 유형 인 Python 코드가 float있습니다. 확장자로 저장 .dat하면 파일 크기는 500MB 정도입니다. 사용 h5py하면 파일 크기가 상당히 줄어든다는 것을 읽었습니다 . 그래서 2D numpy 배열이 A. h5py 파일에 어떻게 저장합니까? 또한 배열을 조작해야하므로 동일한 파일을 읽고 다른 코드에 numpy 배열로 배치하는 방법은 무엇입니까?


4
.dat확장 기능으로 어떻게 저장 합니까?
jorgeca 2014 년

@jorgeca : 난 그냥 할 것을 위해np.savetxt("output.dat",A,'%10.8e')
lovespeed

3
감사합니다 (확장자만으로는 별 의미가 없으며 바이너리, ASCII로 저장할 수 있습니다 ...). hdf5의 추가 기능이 필요하지 않다면 np.save('output.dat', A)바이너리 형식으로 저장하는 것입니다 (훨씬 빠르고 공간이 훨씬 적게 사용됨).
jorgeca 2014 년

@jorgeca하지만 난으로 호출 할 때 다른 파이썬 스크립트는 2 차원 배열로 읽을 수A = np.loadtxt('output.dat',unpack=True)
lovespeed

2
그래서 h5py그보다 작은 파일을 만들지 np.save않습니까? 입니다 h5py보다 빠른 np.save질문에 주어진 크기의 배열을 검색 하시나요?
dbliss

답변:


131

h5py는 데이터 세트그룹 모델을 제공합니다 . 전자는 기본적으로 배열이고 후자는 디렉토리라고 생각할 수 있습니다. 각각 이름이 지정됩니다. API 및 예제에 대한 문서를 확인해야합니다.

http://docs.h5py.org/en/latest/quick.html

모든 데이터를 미리 만들고 hdf5 파일에 저장하려는 간단한 예는 다음과 같습니다.

In [1]: import numpy as np
In [2]: import h5py
In [3]: a = np.random.random(size=(100,20))
In [4]: h5f = h5py.File('data.h5', 'w')
In [5]: h5f.create_dataset('dataset_1', data=a)
Out[5]: <HDF5 dataset "dataset_1": shape (100, 20), type "<f8">

In [6]: h5f.close()

그런 다음 다음을 사용하여 해당 데이터를 다시로드 할 수 있습니다. '

In [10]: h5f = h5py.File('data.h5','r')
In [11]: b = h5f['dataset_1'][:]
In [12]: h5f.close()

In [13]: np.allclose(a,b)
Out[13]: True

문서를 확실히 확인하십시오.

http://docs.h5py.org

hdf5 파일에 쓰기는 h5py 또는 pytables에 따라 다릅니다 (각각 hdf5 파일 사양 위에있는 다른 Python API가 있음). 또한 기본적으로 같은 NumPy와 제공하는 다른 간단한 바이너리 형식을 살펴해야한다 np.save, np.savez등 :

http://docs.scipy.org/doc/numpy/reference/routines.io.html


Btw. 읽는 동안 데이터 세트의 이름을 미리 모르는 경우 여기 와 유사한 hdf 파일을 구문 분석해야 합니다 .
Trilarion

데이터 세트에 열을 추가하려면 @JoshAdel. 내 데이터 세트는 [img_id, rows, colums, channels]로 색인 된 다차원 np.array입니다. 귀하의 답변에 설명 된 방법을 사용하여 저장했습니다. h5f [ 'dataset_1'] [img_id]를 사용하여 데이터 세트의 모든 포인트에 액세스합니다. 내가 원하는 것은 데이터 세트의 모든 img_id에 해당하는 'mycolumn'이라는 다른 열을 추가하는 방법입니다. h5f [ 'mycolumn'] [img_id] 할 수 있도록 다른 열을 어떻게 추가해야합니까?
iratzhash

이와 같은 행렬을 작성하면 HDFView 2.11에서 볼 수 없습니다. 파일을 열 수 있고 데이터 세트 data.h5가 존재하는 것을 볼 수 있지만 HDFView로 볼 수 없습니다. h5py로 내용을 읽을 수 있지만 HDFView로 검사 할 수는 없습니다. 왜 그런지 아세요?
Martin Thoma

104

파일 열기 / 닫기를 처리하고 메모리 누수를 방지 하는 더 깨끗한 방법 :

예습:

import numpy as np
import h5py

data_to_write = np.random.random(size=(100,20)) # or some such

쓰다:

with h5py.File('name-of-file.h5', 'w') as hf:
    hf.create_dataset("name-of-dataset",  data=data_to_write)

읽다:

with h5py.File('name-of-file.h5', 'r') as hf:
    data = hf['name-of-dataset'][:]

2
파일을 닫을 필요가 없습니까?
ricoamor

23
어떤 @DrDeSancho, 와 문
레오 니드

1
(하나 제대로 첫 번째 시도에서 닫지 않고 동일한 코드를 다시 실행 때 이미 열려있는 파일에 대한 h5py에서 예외가 하나, 그렇지 않으면 때문에 위험) 대화 형 모드에서 실행할 때 특히 유용합니다
앙드레 HOLZNER을

withPython 의 기능은 컨텍스트 관리자로 알려져 있습니다. 파일이 사용 된 후 닫혔는지 확인합니다. 자세한 내용은 공식 문서에서 확인할 수 있습니다. docs.python.org/3/library/contextlib.html
Mark
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.