JĘZYK PYTHON - NARZĘDZIE DLA KAŻDEGO NAUKOWCA Michał & Mateusz w zastępstwie za Marcin Lewandowski [ mlew@ippt.gov.pl ]
WYJAŚNIENIE Przepraszam Państwa, ale wyskoczyło mi ważne spotkanie i nie mogę dzisiaj poprowadzić wykładu. Poprosiłem moich kolegów z ZU o zajęcie się Państwem. Zgodnie z sugestią pogłębimy temat HDF5. Marcin Lewandowski 2
HDF5 3
HDF5 Hierarchical Data Format (HDF, HDF4, HDF5 ) określa format oraz zestaw bibliotek do zachowywania i manipulowania BARDZO DUŻYMI zestawami danych numerycznych Oryginalnie opracowany w National Center for Supercomputing Applications, obecnie rozwijany i wspierany przez organizację non-profit The HDF Group (http://www.hdfgroup.com) OTWARTY!!! 4
HDF5 cechy Uniwersalny i hierarchiczny model danych pozwala na reprezentację złożonych struktur danych oraz metadanych (a la system plikowy w pliku) W pełni przenośny pomiędzy różnymi platformami Obsługa plików > 2GB OFICJALNE biblioteki dla: C, C++, Fortran 90, Java INNE biblioteki: Matlab (7+), Perl, Python Dostępne narzędzia do zarządzania, przeglądania, analizy i manipulacji 5
HDF5 struktura HDF5 jest hierarchiczny struktury: Groups & Datasets Dodatkowo Attributes mogą być przypisane do danego Dataset HDF5 Groups zawierają: Strukturę grupującą 0 lub więcej Groups lub Datasets Dodatkowe metadane HDF5 Datasets zawiera: Nagłówek danych Tablicę danych 6
Structures to organize objects Groups / (root) 3-D array /foo palette lat lon temp ---- ----- ----- 12 23 3.1 15 24 4.2 17 21 3.6 Table Raster image Datasets Raster image 2-D array 7
HDF5 Dataset Klasy informacji w nagłówku Dataset: Nazwa Datasetu string ASCII Typ danych: Atomowe np. integer, float Złożone struktury Przestrzeń danych określa liczbę wymiarów Datasetu (nielimitowana) Układ Datasetu: Ciągły (domyślny) Blokowy w równych kawałkach zapamiętywanych w różnych częściach pliku (w celu optymalizacji I/O) 8
HDF5 Dataset Rank 3 Metadata Dataspace Dimensions Dim_1 = 4 Dim_2 = 5 Dim_3 = 7 Data Datatype Integer Properties Chunked Compressed (optional) Attributes Time = 32.4 Pressure = 987 Temp = 56 Na podstawie:introduction to HDF5 by Barbara Jones, The HDF Group, The 13th HDF & HDF-EOS Workshop, November 3-5, 2009 9
HDF5 typy danych 10
HDF5 Attributes Attributes małe nazwane Datasety związane z głównymi Datasets, Groups lub nazwanymi typami danych Używane do opisu danych (metadane) Attribute składają się z: Nazwy Wartości Attributes są pamiętane w nagłówkach obiektów, których dotyczą 11
HDFView przeglądarka HDF5 12
HDF5 i Matlab Domyślny format plików MAT od wersji 7.3+ Funkcje wysokiego poziomu zapis/odczyt plików MAT (workspace) Funkcje niskiego poziomu (300 funkcji) bezpośredni dostęp do biblioteki C API Patrz: MATLAB 7 Programming Fundamentals 13
HDF5-Matlab funkcje wysokiego poziomu hdf5info hdf5read hdf5write 14
hdf5info fileinfo = hdf5info(filename) fileinfo = hdf5info(...,'readattributes',bool) [...] = hdf5info(..., 'V71Dimensions', BOOL) Przykład: fileinfo = hdf5info('example.h5') fileinfo = Filename: 'example.h5' LibVersion: '1.8.3' Offset: 0 FileSize: 8172 GroupHierarchy: [1x1 struct] 15
hdf5read data = hdf5read(filename,datasetname) attr = hdf5read(filename,attributename) [data, attr] = hdf5read(...,'readattributes',bool) data = hdf5read(hinfo) [...] = hdf5read(..., 'V71Dimensions', BOOL) 16
HDF5 i Python h5py (http://h5py.googlecode.com) NumPy (http://new.scipy.org) Test: >>> import h5py.tests >>> h5py.tests.runtests() 17
EX: hdf5 Konwersja pliku tekstowego do HDF5 Skrypt T2Hconverter.py służy do konwersji pliku tekstowego (TXT), z danymi przykładowymi, do formatu HDF5 Jako wynik otrzymujemy plik HDF5 (H5) o nazwie identycznej z nazwą pliku danych T2Hconverter [nazwa pliku danych] 18
Tekstowe dane wejściowe ------- listing pliku dane.txt ----------------------------------------------- ; Przykładowy plik z danymi pomiarowymi. ; Średnik na początku linii oznacza komentarz ; Format danych: ; Czas [s] (float), Temperatura [st. C] (float) 0,25.6 5,27.3 10,29.1 15,30.7 20,31.2 25,34.5 30,42.2 35,37.5 40,32.0 45,27.6 50,25.3 55,25.1 60,25.0 -------- koniec listingu ------------------------------------------------------ 19
Struktura pliku wynikowego HDF5 /ROOT ----Header - ConversionDate (string) data i czas konwersji - Description (string) opis pliku - ScriptVersion (pomnożona x10) (int) wersja skryptu zapisu ----Data - Values (float) macierz danych ( rząd 1 - czas, rząd 2 - temp ) 20
Skrypty dla Matlaba Skrypt "h5reader_example.m" odczytuje dane z pliku wejściowego w formacie HDF5 i wyświetla zawartość w oknie roboczym. Nazwa pliku wejściowego znajduję się w zmiennej FILE_NAME deklarowanej na początku skryptu 21
H5PY KROK-PO-KROKU Na podstawie: http://h5py.alfven.org/docs/guide/quick.html 22
Pliki HDF5 Konstruktor plików HDF5 akceptuje tryby analogicznie jak zwykła funkcja open(): r, w, a (domyślny) # tworzy lub nadpisuje plik >>> f = h5py.file('file1.hdf5', 'w') # otwiera istniejący tylko do odczytu >>> f = h5py.file('file2.hdf5', 'r') 23
HDF5 Dataset Utworzenie HDF5 z datasetem (100,100) typu integer Inicjalizacja datasetu wartością 42 >>> import h5py # utworzenie HDF5 >>> f = h5py.file('myfile.hdf5') >>> dset=f.create_dataset("mydataset", (100, 100), 'i') >>> dset[...] = 42 24
HDF5 Dataset c.d. Własności dataset (utworzonego wcześniej) : >>> dset.shape (100, 100) >>> dset.dtype dtype('int32') Dataset można utworzyć z array wbudowanego w NumPy: >>> import numpy >>> arr = numpy.ones((2,3), '=i4') >>> dset = f.create_dataset('anotherdataset', data=arr) 25
Grupy Utworzony Dataset ma nazwę, która tworzy element ścieżki dostępu do niego: >>> dset.name '/MyDataset' Do złudzenia przypomina to system ścieżek w systemach plikowych. W powyższym przykładzie mówimy, że MyDataset znajduje się w Grupie root (/) pliku HDF5. Można tworzyć inne grupy i podgrupy: >>> subgroup = f.create_group("subgroup") >>> subgroup.name '/SubGroup' Każda z nich może z kolei zawierać Datasety i/lub kolejne Grupy: >>> dset2 = subgroup.create_dataset('myotherdataset', (4,5), '=f8') >>> dset2.name '/SubGroup/MyOtherDataset' 26
Grupy c.d. Dostęp do grup za pomocą ścieżki (z podgrupy lub ścieżka bezwzględna dla pliku): >>> dset2 = subgroup['myotherdataset'] >>> dset2 = f['/subgroup/myotherdataset'] # equivalent Grupy oraz obiekt plikowy HDF5 ( f w tym przykładzie) wspierają inne operacje słownikowe: >>> list(f) ['MyDataset', 'SubGroup'] >>> 'MyDataset' in f True >>> 'Subgroup/MyOtherDataset' in f True >>> del f['mydataset'] As a safety feature, you can t create an object with a pre-existing name; you have to manually delete the existing object first: >>> grp = f.create_group("newgroup") >>> grp = f.create_group("newgroup") ValueError: Name already exists (Symbol table: Object already exists) >>> del f['newgroup'] >>> grp = f.create_group("newgroup") 27
Atrybuty HDF5 pozwala na dodawanie dodatkowych małych danych do Grup i Datasetów, są to Atrybuty. Atrybuty mają funkcję metadanych czyli danych o danych, które mogą dodatkowo opisywać dane np. tytuł, timestamp, etc. Obiekt typu słownikowego (Dict) o nazwie attr jest związany z każdą Grupą/Datasetem i służy do dostępu do Atrybutów: >>> dset.attrs <Attributes of HDF5 object "MyDataset" (0)> >>> dset.attrs["name"] = "My Dataset" >>> dset.attrs[ My Index"] = 4 >>> dset.attrs["order Array"] = numpy.arange(10) >>> for name, value in dset.attrs.iteritems():... print name+":", value... Name: My Dataset My Index: 4 Order Array: [0 1 2 3 4 5 6 7 8 9] 28
Dataset funkcje specjalne Datasety HDF5 wspierają specjalne funkcje za pomocą opcji przekazanych do Group.create_dataset(): Chunked storage struktura danych typu bloki indeksowane w B- drzewo lub w sposób ciągły. Tego typu układ może drastycznie przyśpieszać operacje I/O dla pewnych wzorów dostępu do danych (np. co n-ty). Compression przezroczysta bezstratna kompresja danych; dostępne są typy kompresji gzip, lzf, szip. Error-Detection wszystkie pliki HDF5 zawierają sumę kontrolną (algorytm fletcher32), która umożliwia weryfikację zapisz/odczyt dla Datasetu. Błąd sumy kontrolne przy odczycie powoduje wyjątek! Resizing rozmiary Datasety HDF5 mogą być zmieniane w locie (do maksymalnego rozmiaru określonego w momencie tworzenia). 29
Dynamiczny resizing Funkcja Dataset.resize() modyfikuje rozmiar datasetu (w miejscu): >>> dset = grp.create_dataset("name", (10,10), '=f8', maxshape=(none, None)) >>> dset.shape (10, 10) >>> dset.resize((20,20)) >>> dset.shape (20, 20) 30
Dostęp i krojenie Datasetu Dosęp do Dataset za pomocą tradycyjnego slicingu oraz rozszerzonego a la NumPy. Przecięcia (slices) są tłumaczone na odpowiednik HDF5 zwany hyperslab, który zapewnia szybki i efektywny dostęp do danych. Rozpoznawane argumenty slicingu : Liczby: wszystko co jest konwertowalne do Python long Obiekty Slice UWAGA: ujemne indeksy niedozwolone! Nazwy pól dla danych złożonych (compound) Obiekt Ellipsis (...) maksymalnie jeden! 31
Dostęp i krojenie Datasetu przykłady >>> dset = f.create_dataset("mydataset", (10,10,10), 'f') >>> dset[0,0,0] >>> dset[0,2:10,1:9:3] >>> dset[:,::2,5] >>> dset[0] >>> dset[1,5] >>> dset[0,...] >>> dset[...,6] Dla danych złożonych można specyfikować wiele pól na raz: >>> dset["fielda"] >>> dset[0,:,4:5, "FieldA", "FieldB"] >>> dset[0,..., "FieldC"] 32
Broadcasting (rozgłaszanie) Dla prostego slicingu wspierane jest rozgłaszanie wartości: >>> dset[0,:,:] = np.arange(10) # wypełnij (10,10) h5py NIE używa NumPy do realizacji rozgłaszania. Rozgłaszanie jest zaimplementowane za pomocą wielokrotnych selekcji z użyciem HDF5 hyperslab. W tym przykładzie Dataset (1000, 1000) jest rozgłaszany do Datasetu (1000, 1000, 1000) : >>> dset2 = f.create_dataset("mydataset", (1000,1000,1000), 'f') >>> data = numpy.arange(1000*1000, dtype='f').reshape((1000,1000)) >>> dset2[:] = data # To nie wymaga alokacji 3.8GB! Broadcasting jest wspierany tylko dla prostego slicningu. 33
Zgodność z NumPy Datasety implementują następujące funkcje interfejsu obsługi tablic w NumPy (tzw. NumPy-array): Slicing proste i elementy zaawansowanego indeksowania shape atrybut dtype atrybut UWAGA: do tego tematu wrócimy omawiając NumPy 34