Part VI Scientic Computing in Python

tensordot()... Matrices (with mat ... Numpy, scipy, pylab, ipython and matplotlib often used simultaneously...

6 downloads 471 Views 196KB Size
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