Python dla każdego naukowca - 2013

Transkrypt

Python dla każdego naukowca - 2013
PYTHON-2013
Marcin Lewandowski [ [email protected] ]
JĘZYK PYTHON
– NARZĘDZIE DLA KAŻDEGO NAUKOWCA
Dr Marcin Lewandowski [ [email protected] ]
Strona kursu: http://us4us.eu/wydarzenia/kursy/
1
PYTHON-2013
Marcin Lewandowski [ [email protected] ]
SCIPY, NUMPY,
MATPLOTLIB
2
PYTHON-2013
Marcin Lewandowski [ [email protected] ]
Wielka czwórka
• NumPy – podstawowy moduł naukowy (obsługa tablic
a’la Matlab®)
• SciPy – rozbudowany moduł naukowy (numeryka i
algorytmy)
• Matplotlib – moduł do wykresów 2D
• IPy/IPython – interaktywna konsola Pythona
http://ipython.scipy.org/moin
3
PYTHON-2013
Marcin Lewandowski [ [email protected] ]
NumPy – linki
• Strona domowa:
http://www.scipy.org/NumPy
• Dokumentacja:
http://docs.scipy.org/doc/numpy/reference
• Przykłady:
http://www.scipy.org/Numpy_Example_List_With_Doc
• Cookbook:
http://www.scipy.org/Cookbook
4
PYTHON-2013
Marcin Lewandowski [ [email protected] ]
SciPy – linki
• Strona domowa:
http://www.scipy.org
• Dokumentacja:
http://docs.scipy.org/doc/scipy/reference
• Cookbook:
http://www.scipy.org/Cookbook
5
PYTHON-2013
Marcin Lewandowski [ [email protected] ]
Matplotlib – linki
• Strona domowa:
•
•
•
•
http://matplotlib.sourceforge.net
Dokumentacja:
http://matplotlib.sourceforge.net/users/index.html
Przykłady:
http://matplotlib.sourceforge.net/examples/index.html
Cookbook:
http://www.scipy.org/Cookbook/Matplotlib
Galeria:
http://matplotlib.sourceforge.net/gallery.html
6
PYTHON-2013
Marcin Lewandowski [ [email protected] ]
Materiały dodatkowe
• Using IPython for parallel computing
•
•
•
•
•
http://ipython.scipy.org/doc/nightly/html/parallel/index.html
SciPy 2009 – matplotlib tutorial
http://www.archive.org/details/scipy09_introTutorialDay2_1
http://www.archive.org/details/scipy09_advancedTutorialDay1_3
SciPy 2009 – NumPy tutorial
http://www.archive.org/details/scipy09_introTutorialDay2_2
http://www.archive.org/details/scipy09_advancedTutorialDay1_1
SciPy 2009 – SciPy for numerics tutorial
http://www.archive.org/details/scipy09_introTutorialDay2_4
SciPy 2009 – Cython tutorial
http://www.archive.org/details/scipy09_advancedTutorial_6
SciPy 2010 TUTORIALS
http://conference.scipy.org/scipy2011/tutorials.html
7
PYTHON-2013
Marcin Lewandowski [ [email protected] ]
MATPLOTLIB W
PRZYKŁADACH
8
PYTHON-2013
Marcin Lewandowski [ [email protected] ]
Sposoby na matpotlib
• Trzy sposoby pracy z matplotlib:
• matplotlib.pyplot – główny moduł rysujący Matplotlib
• pylab – wygodny moduł do pracy interaktywnej; łaczy Matplotlib i
NumPy tworząc środowisko a’la Matlab®
• OOP – pełny obiektowy interfejs do Matplotlib
9
PYTHON-2013
Marcin Lewandowski [ [email protected] ]
Tryb interaktywny/i nie
• „Interaktywność” Matplotlib oznacza kiedy wykres jest uaktualniany
(odrysowywany):
• W trybie interaktywnym po każdej komendzie rysowania (plot)
• W trybie nieinteraktywnym tylko po wywołaniu: draw() lub show()
• Ipython z opcją -pylab automatycznie włącza tryb interaktywny
• Inne możliwości sterowanie trybem pracy:
• Flaga w pliku konfiguracji matplotlibrc
• Opcja w słowniku matplotlib.rcParams ['interactive']
• Funkcja matplotlib.interactive(True/False)
• W Pylab:
• isinteractive() – zwraca True dla trybu interaktywnego
• ion() – włącza tryb interaktywny
• ioff() – wyłącza tryb interaktywny
• draw() – wymusza odrysowanie wykresu
• PAMIĘTAJ, że operacja odrysowywania wiąże się z kosztem
obliczeniowym (dużym dla poważnych wykresów). Dlatego czasami
efektywnie jest wyłączyć tryb interaktywny, żeby zyskać na czasie.
10
PYTHON-2013
Marcin Lewandowski [ [email protected] ]
Linki
• Matplotlib galeria
http://matplotlib.sourceforge.net/gallery.html
• Matplotlib w przykładach
http://matplotlib.sourceforge.net/examples/index.html
• Matplotlib dokumentacja (900+ stron!!!)
http://matplotlib.sourceforge.net/contents.html
http://matplotlib.sf.net/Matplotlib.pdf
• Pylab – Py(thon+Mat)lab, czyli: scipy/numpy/matplotlib
http://matplotlib.sourceforge.net
11
PYTHON-2013
Marcin Lewandowski [ [email protected] ]
http://matplotlib.sourceforge.net/gallery.html
12
PYTHON-2013
Marcin Lewandowski [ [email protected] ]
Matplotlib i Latex
• Przykłady matplotlib do Latexa:
http://www.scipy.org/Cookbook/Matplotlib/LaTeX_Examples
• Matplotlib zawiera wbudowany „silnik” do rysoawnia
wyrażeń TeX – mathtext
• mathtext składa wyrażenia matematyczne TeX przy
pomocy FreeType 2 i domyślnych czcionek Computer
Modern
• Alternatywnie Matplotlib może używać pełnego LATEXa:
• rcParams['text.usetex'] = True
• Ten mod pracy wymaga instalacji: LaTeX, dvipng i
Ghostscript
• LATEX jest wtedy używany do rysowania wszystkich
tekstów na rysunkach (nie tylko matematycznych)
13
PYTHON-2013
14
Marcin Lewandowski [ [email protected] ]
matplotlib.pyplot vs. pylab
Użyj matplotlib.pyplot
import numpy as np
import matplotlib.pyplot as plt
x = np.arange(0, 5, 0.1)
y = np.sin(x)
plt.plot(x, y)
plt.show()
Użyj pylab
from pylab import *
x = arange(0, 5, 0.1)
y = sin(x)
plot(x, y)
show()
PYTHON-2013
Marcin Lewandowski [ [email protected] ]
Interaktywne okno wykresu matplotlib
Skrót klawiaturowy
Komenda
h, r, home
Home/Reset
l, left arrow, backspace
Wstecz
v, right arrow
Naprzód
p
Pan or Zoom
o
Zoom
s
Zapisz
f
Przełączanie trybu pełnoekranowy
trzymany x / y
Zoom w osi X lub Y
trzymany ctrl
Zachowywanie proporcji (aspect ratio)
g
Włączanie/wyłączanie siatki
l
Przełączanie skali osi Y – logarytmiczna/liniowa
15
PYTHON-2013
Marcin Lewandowski [ [email protected] ]
Kolory matplotlib
Skrót klawiaturowy
Komenda
b
blue
c
cyan
g
green
k
black
m
magenta
r
red
w
white
y
yellow
#FF00FF
String haksadecymalny (format HTML)
(0.5, 1, 1)
(1, 0, 1, 1)
Format RGB lub RGBA
'0.7'
Jasność w skali szarości
16
PYTHON-2013
Line styles
Marcin Lewandowski [ [email protected] ]
17
PYTHON-2013
Marcin Lewandowski [ [email protected] ]
Marker styles
18
PYTHON-2013
Marcin Lewandowski [ [email protected] ]
Inne możliwości
• Umieszczanie (embedding) Matplotlib w:
• GTK+
• Qt 4
• wxPython
• Matplotlib na stony WEB (CGI,
mod_python, Django, Pylons)
• Basemap toolkit – rysowanie danych
geograficznych
http://matplotlib.sourceforge.net/basemap/d
oc/html/index.html
19
PYTHON-2013
Marcin Lewandowski [ [email protected] ]
IPYTHON
20
PYTHON-2013
Marcin Lewandowski [ [email protected] ]
iPython – interaktywny shell Pythona
• http://ipython.org/
• Interaktywny wygodny shell
• Wbudowana grafika
• Integracja z Pylab/Matplotlib
• INSTALACJA
• EDP – uaktualnienie wersji:
easy_install -U ipython
• Pełna instalacja:
• http://conference.scipy.org/scipy2012/resources/fp_installs.php
21
PYTHON-2013
Marcin Lewandowski [ [email protected] ]
22
iPython – funkcje
• <TAB> (tzw. ’Tab completion’)
automatyczne uzupełnianie nazw zmiennych i obiektów, co znacznie
skaraca czas pisania poleceń. Nie trzeba pamiętać nazw funkcji, można
je sobie łatwo podejrzeć!
• nazwa_obiektu?
nazwa_obiektu??
Help dla danego obiektu – drukuje informacje na temat tego obiektu
(funkcji, klasy etc.).
? – korzysta z docstrings, definicji funkcji (lista argumentów)
?? – pokazuje kod
• ! komenda_systemowa
wykonanie poleceń systemowych i przechwycenie ich rezultatów!
• Historia komend/rezultatów
specjalne zmienne _ , __ , _1, _2 trzymają historię rezultatów oraz
_i1, _i2 historię komend
• Debuggowanie kodu po błędzie/wyjątku
PYTHON-2013
Marcin Lewandowski [ [email protected] ]
23
iPython – funkcje magiczne (%)
• %quickref – wyświetla IPython Quick Reference Card
• %magic – Display detailed documentation for all of the available magic commands
•
•
•
•
•
•
•
•
•
•
•
%paste, %cpaste – wkleja i wykonuje kod ze schowka (clipboard)
%debug – uruchamia interaktywny debugger
%hist – drukuje historię komend
%pdb – Automatically enter debugger after any exception
%reset – kasuje wszystkie zmienne i nazwy (czyści shell)
%page obiekt – drukuje zawartość obiektu metodą „Pretty print” z podziałem na
strony
%run script.py – ładuje i wykonuje script w IPython
%prun komenda – wykonuje komenda w profilerze (cProfile)
%time / %timeit komenda – mierzy czas wykonania komendy (%timeit wykonuje 10
razy i mierzy średni czas wykonania)
%who, %who_ls, %whos – wyświetla informację o zdefiniowanych zmiennych
%xdel zmienna – kasuje zmienną
PYTHON-2013
Marcin Lewandowski [ [email protected] ]
24
iPython – funkcje c.d.
• !cmd – Execute cmd in the system shell
• output = !cmd args – Run cmd and store the stdout in output
• %alias alias_name cmd – Define an alias for a system (shell)
•
•
•
•
•
•
•
•
command
%bookmark – Utilize IPython’s directory bookmarking system
%cd directory – Change system working directory to passed directory
%pwd – Return the current system working directory
%pushd directory – Place current directory on stack and change to
target directory
%popd – Change to directory popped off the top of the stack
%dirs – Return a list containing the current directory stack
%dhist – Print the history of visited directories
%env – Return the system environment variables as a dict
PYTHON-2013
Marcin Lewandowski [ [email protected] ]
25
iPython Notebook – linki
• NOTEBOOKI:
• https://github.com/ipython/ipython/wiki/A-gallery-of-interesting-IPython-
Notebooks
• https://github.com/ipython/ipython/tree/master/examples/notebooks
• https://github.com/jrjohansson/scientific-python-lectures
• https://bitbucket.org/hrojas/learn-pandas
• WEBCAST:
• http://ipython.org/videos.html
PYTHON-2013
Marcin Lewandowski [ [email protected] ]
26
iPython Notebook – skróty klawiszowe
• Shift-Enter – wykonuje aktywną celę, pokazuje rezultat
(jeśli jest) i przechodzi do kolejnej celi.
(sam klawisz Enter nie powoduje wykonania/ewaluacji!)
• Ctrl-Enter – wykonanie aktywną celę „w miejscu”, tzn. nie
przechodzi po wykonaniu do kolejnej.
Wygodne do szybkiego eksperymentowania i nie
powoduje tworzenia wielu cel z kodem
• Ctrl-m – skrót klawiszowy – prefiks do innych poleceń
Użyj Ctrl-m h żeby zobaczyć help z tymi poleceniami.
PYTHON-2013
Marcin Lewandowski [ [email protected] ]
iPython Notebook – skróty klawiszowe c.d.
27
PYTHON-2013
Marcin Lewandowski [ [email protected] ]
iPython Notebook – uruchomienie
$ ipython notebook
• Standardowo nie ładuje pylab – tylko sam iPython
$ ipython notebook --pylab
• Tak uruchamiamy iPython z pylab – wykresy są
pokazywane w zewnetrznym interaktywnym oknie
(podobnie jak w pylab z konsoli Qt)
$ ipython notebook --pylab inline
• Uruchamienie iPython z pylab – wykresy inline
28
PYTHON-2013
HDF5
Marcin Lewandowski [ [email protected] ]
29
PYTHON-2013
Marcin Lewandowski [ [email protected] ]
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!!!
30
PYTHON-2013
Marcin Lewandowski [ [email protected] ]
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
31
PYTHON-2013
Marcin Lewandowski [ [email protected] ]
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
32
PYTHON-2013
33
Marcin Lewandowski [ [email protected] ]
Structures to organize objects
“Groups”
“/” (root)
3-D array
“/foo”
lat | lon | temp
----|-----|----12 | 23 | 3.1
15 | 24 | 4.2
17 | 21 | 3.6
palette
Table
Raster image
Raster image
“Datasets”
2-D array
PYTHON-2013
Marcin Lewandowski [ [email protected] ]
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)
34
PYTHON-2013
35
Marcin Lewandowski [ [email protected] ]
HDF5 Dataset
Metadata
Data
Dataspace
Rank Dimensions
3
Datatype
Dim_1 = 4
Dim_2 = 5
Dim_3 = 7
Integer
(optional)
Attributes
Properties
Time = 32.4
Chunked
Pressure = 987
Compressed
Temp = 56
Na podstawie:Introduction to HDF5 by Barbara Jones, The HDF Group,
The 13th HDF & HDF-EOS Workshop, November 3-5, 2009
PYTHON-2013
HDF5 typy
danych
Marcin Lewandowski [ [email protected] ]
36
PYTHON-2013
Marcin Lewandowski [ [email protected] ]
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ą
37
PYTHON-2013
Marcin Lewandowski [ [email protected] ]
HDFView – przeglądarka HDF5
38
PYTHON-2013
Marcin Lewandowski [ [email protected] ]
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
39
PYTHON-2013
Marcin Lewandowski [ [email protected] ]
HDF5-Matlab funkcje wysokiego poziomu
• hdf5info
• hdf5read
• hdf5write
40
PYTHON-2013
Marcin Lewandowski [ [email protected] ]
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]
41
PYTHON-2013
Marcin Lewandowski [ [email protected] ]
42
hdf5read
data = hdf5read(filename,datasetname)
attr = hdf5read(filename,attributename)
[data, attr] =
hdf5read(...,'ReadAttributes',BOOL)
data = hdf5read(hinfo)
[...] = hdf5read(..., 'V71Dimensions', BOOL)
PYTHON-2013
Marcin Lewandowski [ [email protected] ]
HDF5 i Python
• h5py (http://h5py.googlecode.com)
• NumPy (http://new.scipy.org)
• Test:
>>> import h5py.tests
>>> h5py.tests.runtests()
43
PYTHON-2013
44
Marcin Lewandowski [ [email protected] ]
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]
PYTHON-2013
Marcin Lewandowski [ [email protected] ]
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 ------------------------------------------------------
45
PYTHON-2013
Marcin Lewandowski [ [email protected] ]
46
Struktura pliku wynikowego HDF5
/ROOT
|
|----Header
|
|
|
|- ConversionDate
(string) data i
czas konwersji
|
|
|
|- Description
(string) opis pliku
|
|
|
|- ScriptVersion
(int) wersja
skryptu zapisu (pomnożona x10)
|
|----Data
|
|
|
|- Values
(float) macierz danych (
rząd 1 - czas, rząd 2 - temp )
PYTHON-2013
Marcin Lewandowski [ [email protected] ]
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
47
PYTHON-2013
Marcin Lewandowski [ [email protected] ]
H5PY KROK-PO-KROKU
Na podstawie: http://h5py.alfven.org/docs/guide/quick.html
48
PYTHON-2013
Marcin Lewandowski [ [email protected] ]
49
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')
PYTHON-2013
Marcin Lewandowski [ [email protected] ]
50
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
PYTHON-2013
Marcin Lewandowski [ [email protected] ]
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)
51
PYTHON-2013
Marcin Lewandowski [ [email protected] ]
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'
52
PYTHON-2013
Marcin Lewandowski [ [email protected] ]
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")
53
PYTHON-2013
Marcin Lewandowski [ [email protected] ]
54
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]
PYTHON-2013
Marcin Lewandowski [ [email protected] ]
55
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).
PYTHON-2013
Marcin Lewandowski [ [email protected] ]
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)
56
PYTHON-2013
Marcin Lewandowski [ [email protected] ]
57
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!
PYTHON-2013
Marcin Lewandowski [ [email protected] ]
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"]
58
PYTHON-2013
Marcin Lewandowski [ [email protected] ]
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”.
59
PYTHON-2013
Marcin Lewandowski [ [email protected] ]
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
60