Python dla naukowca
- NumPy - wydajne typy danych oraz tablice i funkcje do operowania na nich
- SciPy - biblioteka różnych przydatnych naukowych funckji (fft, integrals, odes)
- Matplotlib - wykresy w 2D i 3D
- IPython - interaktywna konsola pythona, notebook i więcej
- SymPy - biblioteka do obliczeń symbolicznych (jak mathematica tylko otwarta i fajniejsza)
- pandas - biblioteka do operacji na danych (przypomina pakiet R)
NumPy
Typy danych
Po co nam typy danych?
Jakie są wspierane?
Przykład:
>>> import numpy as np >>> x = np.float32(1.0) >>> x 1.0 >>> y = np.int_([1,2,4]) >>> y array([1, 2, 4]) >>> z = np.arange(3, dtype=np.uint8) >>> z array([0, 1, 2], dtype=uint8)
Tworzenie tablic (1)
- z pythonowych obiektów
- wbudowane funkcje
>>> from numpy import * >>> a = array( [2,3,4] ) >>> a array([2, 3, 4]) >>> a.dtype dtype('int32') >>> b = array([1.2, 3.5, 5.1]) >>> b.dtype dtype('float64')
Tworzenie tablic (2)
Z listy list powstanie tablica dwuwymiarowa, z listy list list trzywymiarowa ;) i tak dalej.
>>> b = array( [ (1.5,2,3), (4,5,6) ] ) >>> b array([[ 1.5, 2. , 3. ], [ 4. , 5. , 6. ]])
Typ tablicy można podać przy tworzeniu:
>>> c = array( [ [1,2], [3,4] ], dtype=complex ) >>> c array([[ 1.+0.j, 2.+0.j], [ 3.+0.j, 4.+0.j]])
Specjalne funkcje do tworzenia tablic:
>>> zeros( (3,4) ) array([[0., 0., 0., 0.], [0., 0., 0., 0.], [0., 0., 0., 0.]]) >>> ones( (2,3,4), dtype=int16 ) # dtype can also be specified array([[[ 1, 1, 1, 1], [ 1, 1, 1, 1], [ 1, 1, 1, 1]], [[ 1, 1, 1, 1], [ 1, 1, 1, 1], [ 1, 1, 1, 1]]], dtype=int16) >>> empty( (2,3) ) array([[ 3.73603959e-262, 6.02658058e-154, 6.55490914e-260], [ 5.30498948e-313, 3.14673309e-307, 1.00000000e+000]])
Indeksowanie
>>> a = arange(10) ** 3 >>> a array([ 0, 1, 8, 27, 64, 125, 216, 343, 512, 729]) >>> a[2] 8 >>> a[2:5] array([ 8, 27, 64]) >>> a[:6:2] = -1000 # equivalent to a[0:6:2] = -1000; from start to position 6, exclusive, set every 2nd element to -1000 >>> a array([-1000, 1, -1000, 27, -1000, 125, 216, 343, 512, 729]) >>> a[ : :-1] # reversed a array([ 729, 512, 343, 216, 125, -1000, 27, -1000, 1, -1000])
Algebra liniowa
- w numpy są zaimplementowane macierze, które są bardzo proste w użyciu
- poza tym można wykonywać obliczenia związane z algebrą liniową na zwykłych numpajowych tablicach: reference
Przykład kodu z macierzami
>>> A = mat([[3, 1, 4], [1, 5, 9], [2, 6, 5]]) >>> A = mat('3 1 4; 1 5 9; 2 6 5') # equivalent >>> print A [[3 1 4] [1 5 9] [2 6 5]] >>> A matrix([[3, 1, 4], [1, 5, 9], [2, 6, 5]]) >>> A.T # transpose matrix([[3, 1, 2], [1, 5, 6], [4, 9, 5]]) >>> A.H # Hermitian transpose (same for real matrix) matrix([[3, 1, 2], [1, 5, 6], [4, 9, 5]]) >>> A.I # matrix inverse matrix([[ 0.32222222, -0.21111111, 0.12222222], [-0.14444444, -0.07777778, 0.25555556], [ 0.04444444, 0.17777778, -0.15555556]])
Scipy
scipy lecture notes, dokumentacja scipy, scipy cookbook
Co można zrobić używając scipy?
- scipy.cluster Vector quantization / Kmeans
- scipy.constants Physical and mathematical constants
- scipy.fftpack Fourier transform
- scipy.integrate Integration routines
- scipy.interpolate Interpolation
- scipy.io Data input and output
- scipy.linalg Linear algebra routines
- scipy.ndimage n-dimensional image package
- scipy.odr Orthogonal distance regression
- scipy.optimize Optimization
- scipy.signal Signal processing
- scipy.sparse Sparse matrices
- scipy.spatial Spatial data structures and algorithms
- scipy.special Any special mathematical functions
- scipy.stats Statistics
Matplotlib
Przykład kodu generaującego wykres funkcji
import numpy as np import matplotlib.pyplot as plt font = {'family' : 'serif', 'color' : 'darkred', 'weight' : 'normal', 'size' : 16, } x = np.linspace(0.0, 5.0, 100) y = np.cos(2 * np.pi * x) * np.exp(-x) plt.plot(x, y, 'k') plt.title('Damped exponential decay', fontdict=font) plt.text(2, 0.65, r'$\cos(2 \pi t) \exp(-t)$', fontdict=font) plt.xlabel('time (s)', fontdict=font) plt.ylabel('voltage (mV)', fontdict=font) # Tweak spacing to prevent clipping of ylabel plt.subplots_adjust(left=0.15) plt.show()
Histogram
Kod generujący histogram
import numpy as np import matplotlib.mlab as mlab import matplotlib.pyplot as plt # example data mu = 100 # mean of distribution sigma = 15 # standard deviation of distribution x = mu + sigma * np.random.randn(10000) num_bins = 50 # the histogram of the data n, bins, patches = plt.hist(x, num_bins, normed=1, facecolor='green', alpha=0.5) # add a 'best fit' line y = mlab.normpdf(bins, mu, sigma) plt.plot(bins, y, 'r--') plt.xlabel('Smarts') plt.ylabel('Probability') plt.title(r'Histogram of IQ: $\mu=100$, $\sigma=15$') # Tweak spacing to prevent clipping of ylabel plt.subplots_adjust(left=0.15) plt.show()
pandas
Czym jest pandas?
Do czego się przydaje?
Sympy
- analiza z sympy
- obliczenia symboliczne
- całki i pochodne
Notebooki
ćwiczenie:
Opis problemu:
Pierwiastek A rozpada się na pierwiastek B, a pierwiastek B rozpada się do pierwiastka C. Pierwiastek C nie ulega rozpadowi radioaktywnemu.
A -> B -> C
Znamy stałą rozpadu lambda-a i lambda-b. Jak zamodelować taki proces?
Modelowanie w pythonie
Na przykładzie zombie apokalipsy
Świetne strony:
Świetne blogi
Python jest fantastyczny!