JĘZYK PYTHON NARZĘDZIE DLA KAŻDEGO NAUKOWCA Dr Marcin Lewandowski [ mlew@ippt.pan.pl ] Strona kursu: http://us4us.eu/wydarzenia/kursy/ 1
2 SCIPY, NUMPY, MATPLOTLIB
3 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
4 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
5 SciPy linki Strona domowa: http://www.scipy.org Dokumentacja: http://docs.scipy.org/doc/scipy/reference Cookbook: http://www.scipy.org/cookbook
6 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
7 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
8 MATPLOTLIB W PRZYKŁADACH
9 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
10 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.
11 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
12 http://matplotlib.sourceforge.net/gallery.html
13 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)
14 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()
15 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
16 Kolory matplotlib Skrót klawiaturowy b c g k m r w y #FF00FF (0.5, 1, 1) (1, 0, 1, 1) '0.7' Komenda blue cyan green black magenta red white yellow String haksadecymalny (format HTML) Format RGB lub RGBA Jasność w skali szarości
17 Line styles
18 Marker styles
19 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
20 IPYTHON
21 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
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
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ą
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
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
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.
27 ipython Notebook skróty klawiszowe c.d.
28 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
29 HDF5
30 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!!!
31 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
32 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
33 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
34 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)
35 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
36 HDF5 typy danych
37 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ą
38 HDFView przeglądarka HDF5
39 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
40 HDF5-Matlab funkcje wysokiego poziomu hdf5info hdf5read hdf5write
41 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]
42 hdf5read data = hdf5read(filename,datasetname) attr = hdf5read(filename,attributename) [data, attr] = hdf5read(...,'readattributes',bool) data = hdf5read(hinfo) [...] = hdf5read(..., 'V71Dimensions', BOOL)
43 HDF5 i Python h5py (http://h5py.googlecode.com) NumPy (http://new.scipy.org) Test: >>> import h5py.tests >>> h5py.tests.runtests()
Konwersja pliku tekstowego do HDF5 44 EX: 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]
45 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 ------------------------------------------------------
46 Struktura pliku wynikowego HDF5 /ROOT ----Header - ConversionDate czas konwersji (string) data i - 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 )
47 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
48 H5PY KROK-PO-KROKU Na podstawie: http://h5py.alfven.org/docs/guide/quick.html
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')
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
51 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)
52 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'
53 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")
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]
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).
56 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)
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!
58 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"]
59 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.
60 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