Part VI Scientific Computing in Python
Tobias Neckel: Scripting with Bash and Python Compact Course @ Max-Planck, February 16 - 26, 2015
81
More on Maths Module math • Constants pi and e • Functions that operate on int and float • All return values float ceil ( x ) floor ( x ) exp ( x ) fabs ( x ) ldexp (x , i ) log ( x [ , base ]) log10 ( x ) modf ( x ) pow (x , y ) sqrt ( x )
# same as globally defined abs () # x * 2** i # == log (x , 10) # ( fractional , integer part ) # x ** y
Tobias Neckel: Scripting with Bash and Python Compact Course @ Max-Planck, February 16 - 26, 2015
82
Module math (2) • Trigonometric functions assume radians cos ( x ); cosh ( x ); acos ( x ) sin ( x ); ... tan ( x ); ... degrees ( x ) radians ( x )
# rad -> deg # deg -> rad
Tobias Neckel: Scripting with Bash and Python Compact Course @ Max-Planck, February 16 - 26, 2015
83
Module math (2) • Trigonometric functions assume radians cos ( x ); cosh ( x ); acos ( x ) sin ( x ); ... tan ( x ); ... degrees ( x ) radians ( x )
# rad -> deg # deg -> rad
• inf/nan float ( " inf " ) float ( " - inf " ) float ( " nan " )
Tobias Neckel: Scripting with Bash and Python Compact Course @ Max-Planck, February 16 - 26, 2015
83
Module math (2) • Trigonometric functions assume radians cos ( x ); cosh ( x ); acos ( x ) sin ( x ); ... tan ( x ); ... degrees ( x ) radians ( x )
# rad -> deg # deg -> rad
• inf/nan float ( " inf " ) float ( " - inf " ) float ( " nan " ) • Use module cmath for complex numbers Tobias Neckel: Scripting with Bash and Python Compact Course @ Max-Planck, February 16 - 26, 2015
83
Now to Real Maths. . . Standard sequence types (list, tuple, . . . ) • Can be used as arrays • Can contain different types of objects • •
Very flexible, but slow Loops are not very efficient either
• For efficient scientific computing, other datatypes and methods
required
Tobias Neckel: Scripting with Bash and Python Compact Course @ Max-Planck, February 16 - 26, 2015
84
Now to Real Maths. . . Standard sequence types (list, tuple, . . . ) • Can be used as arrays • Can contain different types of objects • •
Very flexible, but slow Loops are not very efficient either
• For efficient scientific computing, other datatypes and methods
required
Modules • NumPy • Matplotlib • SciPy
Tobias Neckel: Scripting with Bash and Python Compact Course @ Max-Planck, February 16 - 26, 2015
84
NumPy
Tobias Neckel: Scripting with Bash and Python Compact Course @ Max-Planck, February 16 - 26, 2015
85
Module numpy Homogeneous arrays • NumPy provides arbitrary-dimensional homogeneous arrays • Example from numpy import * a = array ([[1 ,2 ,3] ,[4 ,5 ,6]]) print a type ( a ) a . shape print a [0 ,2] a [0 ,2] = -1 b = a *2 print b
Tobias Neckel: Scripting with Bash and Python Compact Course @ Max-Planck, February 16 - 26, 2015
86
Array creation • Create from (nested) sequence type • Direct access with method [] a = array ([1 ,2 ,3 ,4 ,5 ,6 ,7 ,8]) a [1] a = array ([[1 ,2 ,3 ,4] ,[5 ,6 ,7 ,8]]) a [1 ,1] a = array ([[[1 ,2] ,[3 ,4]] ,[[5 ,6] ,[7 ,8]]]) a [1 ,1 ,1]
Tobias Neckel: Scripting with Bash and Python Compact Course @ Max-Planck, February 16 - 26, 2015
87
Array creation • Create from (nested) sequence type • Direct access with method [] a = array ([1 ,2 ,3 ,4 ,5 ,6 ,7 ,8]) a [1] a = array ([[1 ,2 ,3 ,4] ,[5 ,6 ,7 ,8]]) a [1 ,1] a = array ([[[1 ,2] ,[3 ,4]] ,[[5 ,6] ,[7 ,8]]]) a [1 ,1 ,1] • Properties of arrays a . ndim a . shape a . size a . dtype a . itemsize
# # # # #
number of dimensions dimensions number of elements data type number of bytes
Tobias Neckel: Scripting with Bash and Python Compact Course @ Max-Planck, February 16 - 26, 2015
87
Data Types • Exact, C/C++-motivated type of array elements can be specified • Otherwise, defaults are used • Some types (different storage requirements): • int_, int8, int16, int32, int64, • float_, float8, float16, float32, float64, • complex_, complex64, • bool_, character, object_
• Standard python type names result in default behaviour array ([[1 ,2 ,3] ,[4 ,5 ,6]] , dtype = int ) array ([[1 ,2 ,3] ,[4 ,5 ,6]] , dtype = complex ) array ([[1 ,2 ,3] ,[4 ,5 ,6]] , dtype = int8 ) array ([[1 ,2 ,3] ,[4 ,5 ,1000]] , dtype = int8 ) # wrong array ([[1 ,2 ,3] ,[4 ,5 , " hi " ]] , dtype = object )
Tobias Neckel: Scripting with Bash and Python Compact Course @ Max-Planck, February 16 - 26, 2015
88
Create Arrays • (Some) default matrices (optional parameter: dtype) arange ([ a ,] b [ , stride ]) zeros ( (3 ,4) ) ones ( (1 ,3 ,4) ) empty ( (3 ,4) ) linspace (a , b [ , n ]) logspace (a , b [ , n ]) identity ( n )
# as range , 1 D
# # # #
uninitialized ( fast ) n equidistant in [a , b ] 10** a to 10** b 2d
fromfunction ( lambda i , j : i +j , (3 ,4) , dtype = int ) def f (i , j ): return i + j fromfunction (f , (3 ,4) , dtype = int )
Tobias Neckel: Scripting with Bash and Python Compact Course @ Max-Planck, February 16 - 26, 2015
89
Manipulate Arrays • Reshaping arrays a = arange (12) b = a . reshape ((3 ,4)) a . resize ((3 ,4)) a . transpose () a . flatten ()
# in - place !
# Example use - case : a = arange (144) a . resize ((12 ,12))
Tobias Neckel: Scripting with Bash and Python Compact Course @ Max-Planck, February 16 - 26, 2015
90
Create Arrays (2) • Create/Copy from existing data a = arange (12); a . resize ((3 ,4)) copy ( a ) diag ( a ); tril ( a ); triu ( a ) empty_like ( a ) zeros_like ( a ) ones_like ( a )
# copy shape
a = loadtxt ( " matrix . txt " ) # fromfile () if binary # plenty of options : comments , delim . , usecols , ...
Tobias Neckel: Scripting with Bash and Python Compact Course @ Max-Planck, February 16 - 26, 2015
91
Create Arrays (2) • Create/Copy from existing data a = arange (12); a . resize ((3 ,4)) copy ( a ) diag ( a ); tril ( a ); triu ( a ) empty_like ( a ) zeros_like ( a ) ones_like ( a )
# copy shape
a = loadtxt ( " matrix . txt " ) # fromfile () if binary # plenty of options : comments , delim . , usecols , ... • Matrix output a . tolist () savetxt ( " matrix . txt " , a )
# tofile ()
if binary
Tobias Neckel: Scripting with Bash and Python Compact Course @ Max-Planck, February 16 - 26, 2015
91
Array Access and Manipulation • Typical slicing operations can be used • Separate dimensions by comma a = arange (20); a . resize ((4 ,5)) a [1] a [1:2 ,:] a [: ,::2] a [::2 ,::2] a [::2 ,::2] = [[0 , -2 , -4] ,[ -10 , -12 , -14]] a [1::2 ,1::2] = -1* a [1::2 ,1::2]
Tobias Neckel: Scripting with Bash and Python Compact Course @ Max-Planck, February 16 - 26, 2015
92
Array Access and Manipulation • Typical slicing operations can be used • Separate dimensions by comma a = arange (20); a . resize ((4 ,5)) a [1] a [1:2 ,:] a [: ,::2] a [::2 ,::2] a [::2 ,::2] = [[0 , -2 , -4] ,[ -10 , -12 , -14]] a [1::2 ,1::2] = -1* a [1::2 ,1::2] • Selective access a [ a > 3] a [ a > 3] = -1
Tobias Neckel: Scripting with Bash and Python Compact Course @ Max-Planck, February 16 - 26, 2015
92
Array Access • Iterating over entries for row in a : print row b = arange (30); b . resize ((2 ,3 ,4)) for row in b : for col in row : print col for entry in a . flat : print entry
Tobias Neckel: Scripting with Bash and Python Compact Course @ Max-Planck, February 16 - 26, 2015
93
Computing with Arrays • Fast built-in methods working on arrays a = arange (12); a . resize ((3 ,4)) 3* a a **2 a + a ^2 sin ( a ) sqrt ( a ) prod ( a ) sum ( a ) it = transpose ( a ) x = array ([1 ,2 ,3]) y = array ([10 ,20 ,30]) inner (x , y ) dot ( it , x ) cross (x , y ) Tobias Neckel: Scripting with Bash and Python Compact Course @ Max-Planck, February 16 - 26, 2015
94
Computing with Arrays • There is much more. . . var () mean () min () svd () tensordot () ...
cov () median () max ()
std ()
Tobias Neckel: Scripting with Bash and Python Compact Course @ Max-Planck, February 16 - 26, 2015
95
Computing with Arrays • There is much more. . . var () mean () min () svd () tensordot () ...
cov () median () max ()
std ()
• Matrices (with mat) are subclasses of ndarray, but strictly
two-dimensional, with additional attributes m = mat ( a ) m.T # transpose m.I # inverse m.A # as 2 d array m.H # conjugate transpose
Tobias Neckel: Scripting with Bash and Python Compact Course @ Max-Planck, February 16 - 26, 2015
95
Submodules Module numpy.random • Draw from plenty of different distributions • More powerful than module random • Work on and return arrays from numpy . random import * binomial (10 , 0.5) # 10 trials , success 50% binomial (10 , 0.5 , 15) randint (0 , 10 , 15) # [0 ,10) , int rand () rand (3 ,4)
# [0 ,1) #
(3 x4 ) array
Tobias Neckel: Scripting with Bash and Python Compact Course @ Max-Planck, February 16 - 26, 2015
96
Submodules (2) Module numpy.linalg • Core linear algebra tools norm ( a ); norm ( x ) inv ( a ) solve (a , b ) # LAPACK LU decomp . det ( a ) eig ( a ) cholesky ( a )
Tobias Neckel: Scripting with Bash and Python Compact Course @ Max-Planck, February 16 - 26, 2015
97
Submodules (2) Module numpy.linalg • Core linear algebra tools norm ( a ); norm ( x ) inv ( a ) solve (a , b ) # LAPACK LU decomp . det ( a ) eig ( a ) cholesky ( a )
Module numpy.fft • Fourier transforms
Tobias Neckel: Scripting with Bash and Python Compact Course @ Max-Planck, February 16 - 26, 2015
97
Submodules (2) Module numpy.linalg • Core linear algebra tools norm ( a ); norm ( x ) inv ( a ) solve (a , b ) # LAPACK LU decomp . det ( a ) eig ( a ) cholesky ( a )
Module numpy.fft • Fourier transforms
There is more. . .
Tobias Neckel: Scripting with Bash and Python Compact Course @ Max-Planck, February 16 - 26, 2015
97
Version Mania Current Situation
Matplotlib pylab NumPy
IPython
SciPy
python
Tobias Neckel: Scripting with Bash and Python Compact Course @ Max-Planck, February 16 - 26, 2015
98
Version Mania Problems: • Numpy, scipy, pylab, ipython and matplotlib often used
simultaneously
• The packages depend on each other (matplotlib uses numpy
arrays, e.g.)
• Depending on OS (version), different packages may have to be
installed (i.e. the module name in import command may be different!).
Tobias Neckel: Scripting with Bash and Python Compact Course @ Max-Planck, February 16 - 26, 2015
99
Version Mania Problems: • Numpy, scipy, pylab, ipython and matplotlib often used
simultaneously
• The packages depend on each other (matplotlib uses numpy
arrays, e.g.)
• Depending on OS (version), different packages may have to be
installed (i.e. the module name in import command may be different!).
Vision: All in one (new) module PyLab! • exists as unofficial package • Attention Name: again pylab!
Tobias Neckel: Scripting with Bash and Python Compact Course @ Max-Planck, February 16 - 26, 2015
99
Matplotlib
Tobias Neckel: Scripting with Bash and Python Compact Course @ Max-Planck, February 16 - 26, 2015
100
Matplotlib
What is it? • Object-oriented library for plotting 2D • Designed to be similar to the matlab plotting functionality • Designed to plot scientific data, built on numpy datastructures
Tobias Neckel: Scripting with Bash and Python Compact Course @ Max-Planck, February 16 - 26, 2015
101
Several Ways to do the Same python/ipython interactive > ipython import scipy , matplotlib . pylab x = scipy . randn (10000) matplotlib . pylab . hist (x , 100)
Tobias Neckel: Scripting with Bash and Python Compact Course @ Max-Planck, February 16 - 26, 2015
102
Several Ways to do the Same python/ipython interactive > ipython import scipy , matplotlib . pylab x = scipy . randn (10000) matplotlib . pylab . hist (x , 100) > ipython import numpy . random , matplotlib . pylab x = numpy . random . randn (10000) matplotlib . pylab . hist (x , 100)
Tobias Neckel: Scripting with Bash and Python Compact Course @ Max-Planck, February 16 - 26, 2015
102
Several Ways to do the Same python/ipython interactive > ipython import scipy , matplotlib . pylab x = scipy . randn (10000) matplotlib . pylab . hist (x , 100) > ipython import numpy . random , matplotlib . pylab x = numpy . random . randn (10000) matplotlib . pylab . hist (x , 100)
ipython in pylab mode > ipython - pylab x = randn (10000) hist (x , 100) Tobias Neckel: Scripting with Bash and Python Compact Course @ Max-Planck, February 16 - 26, 2015
102
Example - First Plot partially taken from http://matplotlib.sourceforge.net/users/screenshots.html from pylab import * x = arange (0.0 , 2* pi , 0.01) y = sin ( x ) plot (x , y , linewidth =4) plot (x , y ) xlabel ( ’ Label for x axis ’) ylabel ( ’ Label for y axis ’) title ( ’ Simple plot of sin ’) grid ( True ) show ()
Tobias Neckel: Scripting with Bash and Python Compact Course @ Max-Planck, February 16 - 26, 2015
103
Example – Using Subplots from pylab import * def f ( t ): s1 = cos (2* pi * t ) e1 = exp ( - t ) return multiply ( s1 , e1 ) t1 = arange (0.0 , 5.0 , 0.1) t2 = arange (0.0 , 5.0 , 0.02) t3 = arange (0.0 , 2.0 , 0.01) show () # gives error but helps ; -) subplot (2 ,1 ,1) # rows , columns , which to show plot ( t1 , f ( t1 ) , ’ go ’ , t2 , f ( t2 ) , ’k - - ’) subplot (2 ,1 ,2) plot ( t3 , cos (2* pi * t3 ) , ’r . ’) Tobias Neckel: Scripting with Bash and Python Compact Course @ Max-Planck, February 16 - 26, 2015
104
Example – Using Subplots
# previous slide continued subplot (2 ,1 ,1) grid ( True ) title ( ’A tale of 2 subplots ’) ylabel ( ’ Damped oscillation ’) subplot (2 ,1 ,2) grid ( True ) xlabel ( ’ time ( s ) ’) ylabel ( ’ Undamped ’)
Tobias Neckel: Scripting with Bash and Python Compact Course @ Max-Planck, February 16 - 26, 2015
105
Example - Histogram # start ipython - pylab or use imports : from matplotlib . mlab import * from matplotlib . pyplot import * from numpy import * mu , sigma = 100 , 15 x = mu + sigma * random . randn (10000) n , bins , patches = hist (x , 50 , normed =1 , \ facecolor = ’ green ’ , alpha =0.75) # add a ’ best fit ’ line y = normpdf ( bins , mu , sigma ) plot ( bins , y , ’r - - ’ , linewidth =1) axis ([40 , 160 , 0 , 0.03]) plt . show () Tobias Neckel: Scripting with Bash and Python Compact Course @ Max-Planck, February 16 - 26, 2015
106
SciPy
Tobias Neckel: Scripting with Bash and Python Compact Course @ Max-Planck, February 16 - 26, 2015
107
More than NumPy? • SciPy depends on NumPy • Built to work on NumPy arrays • Providing functionality for mathematics, science and engineering • Still under development • NumPy is mostly about (N-dimensional) arrays • SciPy comprises a large number of tools using these arrays • SciPy includes the NumPy functionality (only one import
necessary)
• A lot more libraries for scientific computing are available, some of
them using NumPy and SciPy
• Here, just a short overview will be given • www.scipy.org for more material (incl. the content of the
following slides)
Tobias Neckel: Scripting with Bash and Python Compact Course @ Max-Planck, February 16 - 26, 2015
108
SciPy Organisation - Subpackages cluster constants fftpack integrate interpolate io linalg maxentropy ndimage odr optimize signal sparse spatial special stats weave
Clustering algorithms Physical and mathematical constants Fast Fourier Transform routines Integration and ordinary differential equation solvers Interpolation and smoothing splines Input and Output Linear algebra Maximum entropy methods N-dimensional image processing Orthogonal distance regression Optimization and root-finding routines Signal processing Sparse matrices and associated routines Spatial data structures and algorithms Special functions Statistical distributions and functions C/C++ integration
Tobias Neckel: Scripting with Bash and Python Compact Course @ Max-Planck, February 16 - 26, 2015
109
Special Functions • Airy functions • Elliptic functions • Bessel functions (+ Zeros, Integrals, Derivatives, Spherical, • • • • • • • • • • •
Ricatti-) Struve functions A large number of statistical functions Gamma functions Legendre functions Orthogonal polynomials (Legendre, Chebyshev, Jacobi,...) Hypergeometric functios parabolic cylinder functions Mathieu functions Spheroidal wave functions Kelvin functions ...
Tobias Neckel: Scripting with Bash and Python Compact Course @ Max-Planck, February 16 - 26, 2015
110
Example: Interpolation - Linear
import numpy as np import matplotlib . pyplot as plt from scipy import interpolate x = np . arange (0 , 2.25* np . pi , np . pi /4) y = np . sin ( x ) f = interpolate . interp1d (x , y ) xnew = np . arange (0 ,2.0* np . pi , np . pi /100) plt . plot (x ,y , ’o ’ , xnew , f ( xnew ) , ’ - ’) plt . title ( ’ Linear interpolation ’) plt . show ()
Tobias Neckel: Scripting with Bash and Python Compact Course @ Max-Planck, February 16 - 26, 2015
111
Example: Interpolation - Cubic Spline import numpy as np import matplotlib . pyplot as plt from scipy import interpolate x = np . arange (0 , 2.25* np . pi , np . pi /4) y = np . sin ( x ) spline = interpolate . splrep (x ,y , s =0) xnew = np . arange (0 ,2.02* np . pi , np . pi /50) ynew = interpolate . splev ( xnew , spline ) plt . plot (x ,y , ’o ’ , xnew , ynew ) plt . legend ([ ’ Linear ’ , ’ Cubic Spline ’ ]) plt . axis ([ -0.05 ,6.33 , -1.05 ,1.05]) plt . title ( ’ Cubic - spline interpolation ’) plt . show ()
Tobias Neckel: Scripting with Bash and Python Compact Course @ Max-Planck, February 16 - 26, 2015
112