Wejście i wyjście tablic numpy do h5py

101

Mam kod w Pythonie, którego wynikiem jest wprowadź opis obrazu tutajmacierz o rozmiarze, którego wszystkie wpisy są tego typu float. Jeśli zapiszę go z rozszerzeniem .dat, rozmiar pliku będzie rzędu 500 MB. Czytałem, że użycie h5pyznacznie zmniejsza rozmiar pliku. Więc powiedzmy, że mam nazwaną tablicę numpy 2D A. Jak zapisać go w pliku h5py? Ponadto, jak odczytać ten sam plik i umieścić go jako tablicę numpy w innym kodzie, ponieważ muszę wykonywać operacje na tablicy?

lovespeed
źródło
4
Jak zapisujesz to z .datrozszerzeniem?
jorgeca
@jorgeca: po prostu to robięnp.savetxt("output.dat",A,'%10.8e')
lovespeed
3
Dzięki (samo rozszerzenie nie znaczy wiele, można je zapisać jako plik binarny, ascii ...). O ile nie potrzebujesz dodatkowych funkcji hdf5, po prostu użyłbym, np.save('output.dat', A)który zapisze go w formacie binarnym (znacznie szybciej, dużo mniej zajętego miejsca).
jorgeca
@jorgeca, ale czy inny skrypt Pythona będzie w stanie odczytać go jako tablicę 2D, kiedy nazywam to jakoA = np.loadtxt('output.dat',unpack=True)
lovespeed
2
więc h5pynie tworzy plików mniejszych niż te np.save? jest h5pyszybszy niż np.savedla tablic o rozmiarze podanym w pytaniu?
dbliss

Odpowiedzi:

132

h5py zapewnia model zbiorów danych i grup . Pierwsza to w zasadzie tablice, a druga to katalogi. Każdy jest nazwany. Powinieneś spojrzeć na dokumentację API i przykłady:

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

Prosty przykład, w którym tworzysz wszystkie dane z góry i chcesz je po prostu zapisać w pliku hdf5, wyglądałby mniej więcej tak:

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

Następnie możesz załadować te dane z powrotem za pomocą: '

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

Zdecydowanie sprawdź dokumenty:

http://docs.h5py.org

Zapis do pliku hdf5 zależy od h5py lub pytables (każdy ma inny interfejs API języka Python, który znajduje się na szczycie specyfikacji pliku hdf5). Należy również zapoznać się z innymi prostych formatów binarnych przez numpy natywnie, takie jak np.save, np.savezetc:

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

JoshAdel
źródło
Przy okazji. jeśli nie znasz wcześniej nazwy zbioru danych podczas czytania, musisz przeanalizować plik hdf podobnie jak tutaj .
Trilarion
@JoshAdel, jeśli chcę dodać kolumnę do zestawu danych. mój zbiór danych to wielowymiarowa tablica np.array indeksowana jako [img_id, wiersze, kolumny, kanały]. i zapisałem go metodą opisaną w Twojej odpowiedzi. Uzyskuję dostęp do wszystkich punktów w zbiorze danych przy użyciu h5f ['dataset_1'] [img_id]. to, czego chcę, to sposób na dodanie kolejnej kolumny z napisem „mycolumn”… odpowiadającej każdemu identyfikatorowi img_id w zestawie danych. jak dodać kolejną kolumnę do tego, aby móc wykonać h5f ['mycolumn'] [img_id]?
iratzhash
Jeśli piszę takie macierze, to nie widzę ich w HDFView 2.11 - mogę otworzyć plik, widzę, że zbiór danych data.h5istnieje, ale nie mogę go wyświetlić za pomocą HDFView. Mogę odczytać zawartość za pomocą h5py, ale nie sprawdzam jej za pomocą HDFView. Każdy pomysł, dlaczego?
Martin Thoma
105

Czystszy sposób obsługi otwierania / zamykania plików i unikania wycieków pamięci:

Przygotowanie:

import numpy as np
import h5py

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

Pisać:

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

Czytać:

with h5py.File('name-of-file.h5', 'r') as hf:
    data = hf['name-of-dataset'][:]
Lavi Avigdor
źródło
2
Nie ma potrzeby zamykania pliku?
ricoamor,
23
@DrDeSancho no, z oświadczeniem
Leonid
1
szczególnie przydatne podczas uruchamiania w trybie interaktywnym (ponieważ w przeciwnym razie można uzyskać wyjątek od h5py dotyczący już otwartego pliku, gdy ponownie uruchamia się ten sam kod bez prawidłowego zamknięcia w pierwszej próbie)
Andre Holzner
withCechą Pythonie jest znany jako kierownik kontekstowego. Upewni się, że plik zostanie zamknięty po użyciu. Więcej informacji można znaleźć w oficjalnej dokumentacji: docs.python.org/3/library/contextlib.html
Mark