Python for science

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)

źródło

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

plot1

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

plot2

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

pandas in 10 minutes

Czym jest pandas?

Do czego się przydaje?

logo

Sympy

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

kod

Świetne strony:

Świetne blogi

Python jest fantastyczny!

python logo

Opublikowano: | Źródło
Comments powered by Disqus
Share