100% found this document useful (1 vote)
70 views

Python Scientific Slides (Boston University)

This document provides an introduction to scientific Python for those with basic Python experience. It covers key scientific Python packages like matplotlib for plotting, NumPy for fast array manipulation, SciPy for mathematical methods, and IPython for an improved interactive Python experience. The document then demonstrates basic plotting in scripts with matplotlib, shows examples using NumPy arrays, and provides an introduction to Conway's Game of Life cellular automata simulation.

Uploaded by

atom tux
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
100% found this document useful (1 vote)
70 views

Python Scientific Slides (Boston University)

This document provides an introduction to scientific Python for those with basic Python experience. It covers key scientific Python packages like matplotlib for plotting, NumPy for fast array manipulation, SciPy for mathematical methods, and IPython for an improved interactive Python experience. The document then demonstrates basic plotting in scripts with matplotlib, shows examples using NumPy arrays, and provides an introduction to Conway's Game of Life cellular automata simulation.

Uploaded by

atom tux
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 94

Scientific Python Tutorial

Scientific Python
Yann Tambouret
Scientific Computing and Visualization
Information Services & Technology
Boston University
111 Cummington St.
[email protected]

October, 2012

Yann - [email protected] (SCV)

Scientific Python

October 2012

1 / 76

This Tutorial
This tutorial is for someone with basic python
experience.
First:
1
2
3
4

matplotlib - plotting library, like Matlab


numpy - fast arrays manipulation
scipy - math methods galore.
ipython - better interactive python

Then I will cover a few intermediate details about


python programming in general

Yann - [email protected] (SCV)

Scientific Python

October 2012

2 / 76

Plotting in scripts
is a package that has many
modules, pyplot is the main driver.
matplotlib is designed for both
interactive and script-based use.
matplotlib

Yann - [email protected] (SCV)

Scientific Python

October 2012

3 / 76

Plotting in scripts
is a package that has many
modules, pyplot is the main driver.
matplotlib is designed for both
interactive and script-based use.
a Figure can contain many Axes ,
which contain many plots.
pyplot creates a default Figure and
Axes if you just want get to plotting
things quickly.
matplotlib

Yann - [email protected] (SCV)

Scientific Python

October 2012

3 / 76

Basic Example

1
2
3
4
5
6
7
8
9

from matplotlib import pyplot


pyplot . plot ([0 , 2 , 4 , 8 , 16 , 32] , " o " )
pyplot . ylabel ( " Value " )
pyplot . xlabel ( " Time " )
pyplot . title ( " Test plot " )
pyplot . show ()

Yann - [email protected] (SCV)

Scientific Python

October 2012

4 / 76

Basic Plot - Results

Yann - [email protected] (SCV)

Scientific Python

October 2012

5 / 76

World Population - Practice Part 1


Explaining whats there

practice/world_population.py
3 def get_data ():
4
data = file ( " w o r l d _ p o p u l a t i o n . txt " , " r " ). readlines ()
5
dates = []
6
populations = []
7
for point in data :
8
date , population = point . split ()
9
dates . append ( date )
10
populations . append ( population )
11
return dates , populations

We read in the data

Yann - [email protected] (SCV)

Scientific Python

October 2012

6 / 76

World Population - Practice Part 1


Explaining whats there

practice/world_population.py
3 def get_data ():
4
data = file ( " w o r l d _ p o p u l a t i o n . txt " , " r " ). readlines ()
5
dates = []
6
populations = []
7
for point in data :
8
date , population = point . split ()
9
dates . append ( date )
10
populations . append ( population )
11
return dates , populations

1
2

We read in the data


For each line (point) we need to separate the date
from population

Yann - [email protected] (SCV)

Scientific Python

October 2012

6 / 76

World Population - Practice Part 1


Explaining whats there

practice/world_population.py
3 def get_data ():
4
data = file ( " w o r l d _ p o p u l a t i o n . txt " , " r " ). readlines ()
5
dates = []
6
populations = []
7
for point in data :
8
date , population = point . split ()
9
dates . append ( date )
10
populations . append ( population )
11
return dates , populations

1
2

We read in the data


For each line (point) we need to separate the date
from population
split() splits text at any whitespace, by default.

Yann - [email protected] (SCV)

Scientific Python

October 2012

6 / 76

World Population - Getting Help


How to read online docs
1
2
3

Google matplotlib and pick first choice


Quick Search (on right side) for pyplot.plot
Select result entitled matplotlib.pyplot.plot

Yann - [email protected] (SCV)

Scientific Python

October 2012

7 / 76

World Population - Practice Part 2


Your Assignment
13
14
15
16
17
18

def plot_world_pop ( dates , populations ):


pass
dates , populations = get_data ()
plot_world_pop ( dates , populations )
pyplot . show ()
1
2
3
4
5

Make a plot of population (y) vs dates (x)


Title: World population over time
Y-axis: World population in millions
X-axis: Year
Set the plot type to a
Magenta, downward-triangle

Yann - [email protected] (SCV)

Scientific Python

October 2012

8 / 76

World Population - Final

Yann - [email protected] (SCV)

Scientific Python

October 2012

9 / 76

Life Expectancy - Practice Part 1


practice/life_expectacies_usa.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

from matplotlib import pyplot


def get_data ():
# each line : year , men , women
data = file ( " l i f e _ e x p e c t a n c i e s _ u s a . txt " , " r " ). readlines ()
dates = []
men = []
women = []
# finish me !
return dates , men , women
def p l o t _ e x p e c t a n c i e s ( dates , men , women ):
pass
dates , men , women = get_data ()
p l o t _ e x p e c t a n c i e s ( dates , men , women )
pyplot . show ()

Yann - [email protected] (SCV)

Scientific Python

October 2012

10 / 76

Life Expectancy - Practice Part 2

1
2
3
4
5

Use split(,) to split strings at commas


Add a label to each plot (look at documentation)
Label Axes and give a title.
Call plot 2x to plot two lines
Add a legend: pyplot.legend
I
I

Quick Search again


search for pyplot.legend

Yann - [email protected] (SCV)

Scientific Python

October 2012

11 / 76

Life Expectancy - Results

Yann - [email protected] (SCV)

Scientific Python

October 2012

12 / 76

Plotting Interactively
1

Yann - [email protected] (SCV)

Home - Backward Foward - Control edit history

Scientific Python

October 2012

13 / 76

Plotting Interactively
1

Yann - [email protected] (SCV)

Home - Backward Foward - Control edit history


Pan - Zoom - Left click +
drag shifts center, right click
+ drag changes zoom

Scientific Python

October 2012

13 / 76

Plotting Interactively
1

Yann - [email protected] (SCV)

Home - Backward Foward - Control edit history


Pan - Zoom - Left click +
drag shifts center, right click
+ drag changes zoom
Zoom - Select zoom region

Scientific Python

October 2012

13 / 76

Plotting Interactively
1

3
4

Yann - [email protected] (SCV)

Home - Backward Foward - Control edit history


Pan - Zoom - Left click +
drag shifts center, right click
+ drag changes zoom
Zoom - Select zoom region
Save

Scientific Python

October 2012

13 / 76

Plotting Interactively
1

3
4

Home - Backward Foward - Control edit history


Pan - Zoom - Left click +
drag shifts center, right click
+ drag changes zoom
Zoom - Select zoom region
Save

is an alternative to pyplot.show()
when you are using pyplot non-interactively.

pyplot.savefig(filename)

Yann - [email protected] (SCV)

Scientific Python

October 2012

13 / 76

Matplotlib Resources
Possibilities:
matplotlib.org/gallery.html
http://matplotlib.org/basemap/users/examples.html

Guide/Tutorial:
matplotlib.org/users/index.html
Questions:
stackoverflow.com
Or contact us: [email protected]
Source for tutorial:
openhatch.org/wiki/Matplotlib
Yann - [email protected] (SCV)

Scientific Python

October 2012

14 / 76

Array Creation

By convention:

import numpy as np

x = np.array([1,2,3], int);

x is a Numpy array
x is like a list, but certain operations are much faster

Yann - [email protected] (SCV)

Scientific Python

October 2012

15 / 76

Array Creation

A 2D array:
1 A = np . array (((1 ,0 ,0) ,
2
(0 , 0 , -1) ,
3
(0 , 1 , 0)))

Yann - [email protected] (SCV)

Scientific Python

October 2012

16 / 76

Array Creation

makes array([ 1., 1.,


same thing for zeroes

np.ones(5)
np.zeros

Yann - [email protected] (SCV)

Scientific Python

1., 1., 1.])

October 2012

17 / 76

Array Creation

makes array([ 1., 1., 1., 1., 1.])


np.zeros same thing for zeroes
np.zeros((2,2)) makes array([[0., 0.], [0., 0.]])
that is a 2D, 2x2 array of zeros
np.ones(5)

Yann - [email protected] (SCV)

Scientific Python

October 2012

17 / 76

Array Creation

np.arange,

numpys version of built-in range method


np.linspace is similar to np.arange but you pass the
number of elements, not step size

Yann - [email protected] (SCV)

Scientific Python

October 2012

18 / 76

Array Basics - Results


4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

>>> import numpy as np


>>> x = np . array (((1 , 2 , 3) , (4 , 5 , 6)))
>>> x . size # total number of elements
6
>>> x . ndim # number of dimensions
2
>>> x . shape # number of elements in each dimension
(2 L , 3 L )
>>> x [1 ,2] # first index is the rows , then the column
6
>>> x [1] # give me 1 row
array ([4 , 5 , 6])
>>> x [1][2]
6
>>> x . dtype
dtype ( int32 )

Yann - [email protected] (SCV)

Scientific Python

October 2012

19 / 76

Basic Operations

14 x = np . array ([0 , np . pi /4 , np . pi /2])


15 np . sin ( x )
16 np . dot ([2 , 2 , 2] , [2 , 2 , 2])

Yann - [email protected] (SCV)

Scientific Python

October 2012

20 / 76

Basic Operations

14 x = np . array ([0 , np . pi /4 , np . pi /2])


15 np . sin ( x )
16 np . dot ([2 , 2 , 2] , [2 , 2 , 2])
22
23
24
25
26

>>> x = np . array ([0 , np . pi /4 , np . pi /2])


>>> np . sin ( x )
array ([ 0.
, 0.70710678 , 1.
>>> np . dot ([2 , 2 , 2] , [2 , 2 , 2])
12

Yann - [email protected] (SCV)

Scientific Python

])

October 2012

20 / 76

Its a Simple Game

Yann - [email protected] (SCV)

Scientific Python

October 2012

21 / 76

Calculating Neighbors

Yann - [email protected] (SCV)

Scientific Python

October 2012

22 / 76

Use the Neighbors to Update

Yann - [email protected] (SCV)

Scientific Python

October 2012

23 / 76

A Practice Problem
In the
1

practice

conway.py

directory:
is a program; try it out.

Yann - [email protected] (SCV)

Scientific Python

October 2012

24 / 76

A Practice Problem
directory:
1
conway.py is a program; try it out.
2
conway work.py is an assignment; try to do it.
3
test conway.py is a program to test your work.
Remember, the shape attribute:
In the

practice

1 a = np . array (((1 ,2) ,(3 ,4) ,(5 ,6))) # make a 3 x2


2 print a . shape [0] # prints 3
3 print a . shape [1] # prints 2

Yann - [email protected] (SCV)

Scientific Python

October 2012

24 / 76

Conways Game of Life


np.roll(a, 1, axis=0)

returns a new array that cycles the

values.
1
2
3
4
5
6
7
8

>>> a
array ([[0 , 1 , 2] ,
[3 , 4 , 5] ,
[6 , 7 , 8]])
>>> np . roll (a , 1 , axis =0)
array ([[6 , 7 , 8] ,
[0 , 1 , 2] ,
[3 , 4 , 5]])

This can be used to make the

Yann - [email protected] (SCV)

neighbors

Scientific Python

function.

October 2012

25 / 76

Conways Game of Life


np.where(b ==0)
np.where(b ==0,
1
2
3
4
5
6
7
8
9
10

returns a series of indicies where its true.


-1, b) to replace 0s with -1s.

>>> b
array ([[ 0. , 0. , 0.] ,
[ 2. , 2. , 2.] ,
[ 0. , 3. , 0.]])
>>> np . where ( b == 0)
( array ([0 , 0 , 0 , 2 , 2]) , array ([0 , 1 , 2 , 0 , 2]))
>>> np . where ( b == 0 , -1 , b )
array ([[ -1. , -1. , -1.] ,
[ 2. , 2. , 2.] ,
[ -1. , 3. , -1.]])

Look up the np.logical or method; this and


be used to redefine the update function.
Yann - [email protected] (SCV)

Scientific Python

np.where

October 2012

can
26 / 76

Matplotlib Imshow

0
1
2
3
4
5
6
7

import matplotlib . pyplot as plt


import numpy as np
a = np . zeros ((3 ,3))
a [1 ,1] = 1
plt . imshow (a ,
interpolation = nearest ,
cmap = plt . winter () ,
origin = lower )

Yann - [email protected] (SCV)

Scientific Python

October 2012

27 / 76

Nearest Neighbors

Yann - [email protected] (SCV)

Scientific Python

October 2012

28 / 76

Matplotlib Imshow

11 plt . imshow (a ,
12 #
interpolation = nearest ,
13
cmap = plt . winter () ,
14
origin = lower )
15 plt . show ()

Yann - [email protected] (SCV)

Scientific Python

October 2012

29 / 76

Default: usually bilinear

Yann - [email protected] (SCV)

Scientific Python

October 2012

30 / 76

Plenty More

www.scipy.org/Tentative_NumPy_Tutorial
Universal Functions section
PyTrieste Numpy Tutorial

Yann - [email protected] (SCV)

Scientific Python

October 2012

31 / 76

scipy: Many Useful Scientific Tools


http://docs.scipy.org/doc/scipy/reference/
tutorial/index.html
Numpy
Integration
Optimization
Interpolation
FFT
Linear Algebra
Statistics
And much more....
Yann - [email protected] (SCV)

Scientific Python

October 2012

32 / 76

Constants
4
5
6
7
8
9
10
11
12
13
14
15
16
17

>>> from scipy import constants


>>> constants . c # speed of light
299792458.0
>>> # physical constants : value , units , uncertainty
>>> constants . p h y s i c a l _ c o n s t a n t s [ " electron mass " ]
(9.10938291 e -31 , kg , 4e -38)
>>> # look - up constants , only first 3 !
>>> masses = constants . find ( " mass " )[:3]
>>> for val in masses :
...
print " {} is available " . format ( val )
...
Planck mass is available
Planck mass energy equivalent in GeV is available
alpha particle mass is available

Yann - [email protected] (SCV)

Scientific Python

October 2012

33 / 76

Zombie Apocalypse - ODEINT


http://www.scipy.org/Cookbook/Zombie_
Apocalypse_ODEINT

Yann - [email protected] (SCV)

Scientific Python

October 2012

34 / 76

Zombie Apocalypse - ODEINT

Yann - [email protected] (SCV)

Scientific Python

October 2012

35 / 76

Zombie Apocalypse - ODEINT


Look at

examples\zombie.py

5 def calc_rate ( P =0 , d =0.0001 , B =0.0095 , G =0.0001 , A =0.0001 , S0 =500):


6
def f (y , t ):
7
Si = y [0]
8
Zi = y [1]
9
Ri = y [2]
10
# the model equations ( see Munz et al . 2009)
11
f0 = P - B * Si * Zi - d * Si
12
f1 = B * Si * Zi + G * Ri - A * Si * Zi
13
f2 = d * Si + A * Si * Zi - G * Ri
14
return [ f0 , f1 , f2 ]
15
Z0 = 0
# initial zombie population
16
R0 = 0
# initial death population
17
y0 = [ S0 , Z0 , R0 ]
# initial condition vector
18
t = np . linspace (0 , 5. , 1000)
# time grid
19
# solve the DEs
20
soln = odeint (f , y0 , t )
21
S = soln [: , 0]
22
Z = soln [: , 1]
23
R = soln [: , 2]
24
return t , S , Z

Yann - [email protected] (SCV)

Scientific Python

October 2012

36 / 76

ipython - plotting

Amazing interactive python.


Using the -pylab flag, you can get plotting for free
1 % ipython - pylab
2 ...
3 In [1]: plot ( range (10))

Yann - [email protected] (SCV)

Scientific Python

October 2012

37 / 76

ipython - Magic Functions

Amazing interactive python.


It provids Magic functions:
cd - like unix change directory
ls - list directory
timeit - time execution of statement
and so on ...

Yann - [email protected] (SCV)

Scientific Python

October 2012

38 / 76

ipython - Logging
Amazing interactive python.
You can log an interactive session:
1 In [1]: logstart mylogfile . py

Everything you type will be recorded to mylogfile.py


logon and logoff turn it on and off
logstop turns it off and saves file
To re-run it in ipython, us the run command:
1 In [1]: run -i mylogfile . py

Yann - [email protected] (SCV)

Scientific Python

October 2012

39 / 76

ipython - Misc.
Amazing interactive python.
You can use ? instead of help().
In [1]: len? and Enter will print help
In fact you get even more information than the
standard help()
Tab-completion
Start typing a method, and pop-up help is shown
You need a newer version than Katanas, and
you need to type ipython qtconsole

Yann - [email protected] (SCV)

Scientific Python

October 2012

40 / 76

Simple Parallelized Python

is a module that allows you to easily start


other processes. They do not share memory, but
multiprocess helps them communicate info/data.
multiprocessing

Yann - [email protected] (SCV)

Scientific Python

October 2012

41 / 76

Pool
creates a pool of processes that you
give tasks to perform. See in
multiprocessing.Pool

examples/mp_vowels_pool.py
16
17
18
19
20
21

nproc = multiprocessing . cpu_count ()


task_pool = multiprocessing . Pool (
processes = nproc ,
initializer = start_proc )
words = " Mary had a little lamb " . split ()

Yann - [email protected] (SCV)

Scientific Python

October 2012

42 / 76

map

takes a function and a list of arguments,


and applies that function to each argument, in parallel.
task pool.map

24

map_results = task_pool . map ( count_vowels , words )

The map method is blocking. The code progresses when


all tasks are complete.

Yann - [email protected] (SCV)

Scientific Python

October 2012

43 / 76

apply async
takes a function and a sequence of
arguments and applies that function to that argument.
task pool.apply async

27
28
29
30
31
32
33
34

async_results = []
for word in words :
async_results . append (
task_pool . apply_async ( count_vowels ,
( word ,)))
task_pool . close () # no more tasks
task_pool . join () # wait here until all

This is not blocking

Yann - [email protected] (SCV)

Scientific Python

October 2012

44 / 76

apply async, getting results

task pool.map
39
40
41

just returns a list of results

for word , nvowels in zip ( words , map_results ):


print " { word : s } has { nvowels : d } vowels " . format ( word = word ,
nvowels = nvowels )

But task pool.apply async returns an object from which


you can get results.
45
46
47

for word , result in zip ( words , async_results ):


print " { word : s } has { nvowels : d } vowels " . format ( word = word ,
nvowels = result . get ())

Yann - [email protected] (SCV)

Scientific Python

October 2012

45 / 76

Outline for section 2


1

Scientific Python

Beyond the Basics


Super Scripting
More on Functions
String Formatting
Files
External Programs
Command line arguments

Solving Laplaces Equation

Yann - [email protected] (SCV)

Scientific Python

October 2012

46 / 76

pass

is pythons way of saying


Keep moving, nothing to see here....

pass

Yann - [email protected] (SCV)

Scientific Python

October 2012

47 / 76

pass

is pythons way of saying


Keep moving, nothing to see here....
Its used for yet unwritten function.
If you try to call a function that doesnt exist, you
get an error.

pass

Yann - [email protected] (SCV)

Scientific Python

October 2012

47 / 76

pass

is pythons way of saying


Keep moving, nothing to see here....
Its used for yet unwritten function.
If you try to call a function that doesnt exist, you
get an error.
pass just creates a function that does nothing.
Great for planning work!

pass

1 def step1 ():


2
pass
3 step1 () # no error !
4 step2 () # error , darn !

Yann - [email protected] (SCV)

Scientific Python

October 2012

47 / 76

None

is Pythons formal value for nothing


Use this as a default value for a variable,
or as a return value when things dont work,
and you dont want a catastrophic error.
None

Yann - [email protected] (SCV)

Scientific Python

October 2012

48 / 76

None

is Pythons formal value for nothing


Use this as a default value for a variable,
or as a return value when things dont work,
and you dont want a catastrophic error.
Test if something is None, to see if you need to handle
these special cases
None

1 name = None
2 if name is None :
3
name = Johnny

Yann - [email protected] (SCV)

Scientific Python

October 2012

48 / 76

"__main__"

Every module has a name, which is stored in __name__


The script/console that you are running is called
"__main__".

Yann - [email protected] (SCV)

Scientific Python

October 2012

49 / 76

"__main__"

Every module has a name, which is stored in __name__


The script/console that you are running is called
"__main__".
Use this to make a file both a module and a script.
1
2
3
4
5
6
7

# module greeting . py
def hey_there ( name ):
print " Hi ! " , name , " ... How s it going ? "
hey_there ( Joey )
if __name__ == " __main__ " :
hey_there ( Timmy )

python greeting.py
Yann - [email protected] (SCV)

Hi! Timmy ... Hows it going?


Scientific Python

October 2012

49 / 76

The Docstring
This is an un-assigned string that is used for
documentation.
It can be at the top of a file, documenting a script
or module
or the first thing inside a function, documenting it.

Yann - [email protected] (SCV)

Scientific Python

October 2012

50 / 76

The Docstring
This is an un-assigned string that is used for
documentation.
It can be at the top of a file, documenting a script
or module
or the first thing inside a function, documenting it.
This is what help() uses...
1 def dot_product ( v1 , v2 ):
2
""" Perform the dot product of v1 and v2 .
3
4
v1 is a three element vector .
5
v2 is a three element vector .
6
"""
7
sum = 0 # ....
Yann - [email protected] (SCV)

Scientific Python

October 2012

50 / 76

Keyword Arguments

Arguments that have default values.


In the function signature, keyword=default_value
None is a good default if you want to make a decision
1 def hello ( name = Joe , repeat = None ):
2
if repeat is None :
3
repeat = len ( name )
4
print Hi ! , name * repeat

Yann - [email protected] (SCV)

Scientific Python

October 2012

51 / 76

Returning Values
A function can return multiple values.
Formally this creates a Tuple - an immutable list

Yann - [email protected] (SCV)

Scientific Python

October 2012

52 / 76

Returning Values
A function can return multiple values.
Formally this creates a Tuple - an immutable list
You can collect the returned values as a Tuple, or as
individual values.
1
2
3
4
5

def pows ( val ):


return val , val * val , val * val * val
two , four , eight = pows (2)
ones = pows (1)
print ones [0] , ones [1] , ones [2] # 1 1 1

Yann - [email protected] (SCV)

Scientific Python

October 2012

52 / 76

string.format()

Strings can be paired with values to control printing.


4
5
6
7
8
9

>>> " Hi there {}! " . format ( Yann )


Hi there Yann !
>>> " Coords : {} , {}; " . format ( -1 , 2)
Coords : -1 , 2;
>>> " {1} , the cost is {0:.2 f } " . format (1125.747025 , Y
Yann , the cost is 1125.75

Yann - [email protected] (SCV)

Scientific Python

October 2012

53 / 76

Keyword arguments to format


Its sometimes tricky to format many values
You can name some of the format targets
9
10
11
12
13
14
15
16

email = """
Subject : { subject }
Date : { mon :2 d }/{ day :2 d }/{ year :2 d }
Message : { msg }
"""
print email . format ( mon =10 , year =12 , day =31 ,
subject = Happy Halloween ,
msg = Booh )

Yann - [email protected] (SCV)

Scientific Python

October 2012

54 / 76

Keyword arguments to format result


13
14
15
16
17
18
19
20
21
22
23
24

>>>
...
...
...
...
>>>
...
...

email = " " "


Subject : { subject }
Date : { mon :2 d }/{ day :2 d }/{ year :2 d }
Message : { msg }
"""
print email . format ( mon =10 , year =12 , day =31 ,
subject = Happy Halloween ,
msg = Booh )

Subject : Happy Halloween


Date : 10/31/12
Message : Booh

More features at:


http://docs.python.org/library/string.html
Yann - [email protected] (SCV)

Scientific Python

October 2012

55 / 76

csv reader and writer


For reading and writing comma-separated-values
csv.reader for reading, csv.writer for writing
Dialects option correspond to predefined formats
excel for excel output without needing to know the
separator and quote characters
1
2
3
4
5

reader = csv . reader ( file )


for row in reader :
# row is a list
writer = csv . writer ( file )
writer . writerow ([1 ,2 ,3])

Yann - [email protected] (SCV)

Scientific Python

October 2012

56 / 76

subprocess

running external programs

1 import subprocess
2 output = subprocess . call ([ ls , -1 ])
3 print " output = " , output

provides many tools


The most basic is the call function.
It takes a list that is joined and executed.
output just holds the exit code (0 if successful)
check_output is like call but 1) returns output and 2)
causes an error if program fails
subprocess

Yann - [email protected] (SCV)

Scientific Python

October 2012

57 / 76

argparse

easy command line arguments

module is the easiest way.


You first create a ArgumentParser object
You define the allowable arguments with the
add_argument function
You can add required or optional arguments
sys.argv is a list of arguments passed to the
program/script.
Pass this list to parse_args function to process and
get an object with your parameters defined.
argparse

Yann - [email protected] (SCV)

Scientific Python

October 2012

58 / 76

argparse

example

Look over
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

examples\argparse_ex.py

import sys
import argparse
parser = argparse . ArgumentParser ( description = Plot zombie statistics )
parser . add_argument ( prefix , help = the prefix for the plot filename )
parser . add_argument ( -p , dest = pop , default =500 , type = int ,
help = Set the startring population )
parser . add_argument ( -s , dest = show ,
help = Show the figure , action = store_true )
parser . add_argument ( city , help = Plot information for a specific city ,
nargs = ? , default = None )
args = sys . argv [1:]
params = parser . parse_args ( args )
print " prefix = " , params . prefix
print " pop = " , params . pop
if params . city is not None :
print " city = " , params . city
print " show ? "
if params . show :
print " yes ! "
else :
print " no : -( "

Yann - [email protected] (SCV)

Scientific Python

October 2012

59 / 76

Solve Laplaces Equation 1a


Solve 2 u = 0

Yann - [email protected] (SCV)

Scientific Python

October 2012

60 / 76

Solve Laplaces Equation 1a


Solve 2 u = 0
Solve iteratively, each time changing u with
following equation:
n+1
n+1
n+1
n
n
uj,l
= 1/4(uj+1,l
+ uj1,l
+ uj,l+1
+ uj,l1
)
Just an averages of the neighboring points.

Yann - [email protected] (SCV)

Scientific Python

October 2012

60 / 76

Solve Laplaces Equation 1a


Solve 2 u = 0
Solve iteratively, each time changing u with
following equation:
n+1
n+1
n+1
n
n
uj,l
= 1/4(uj+1,l
+ uj1,l
+ uj,l+1
+ uj,l1
)
Just an averages of the neighboring points.

Yann - [email protected] (SCV)

Scientific Python

October 2012

60 / 76

Solve Laplaces Equation 1b


Solve 2 u = 0
Solve iteratively, each time changing u with
following equation:
n+1
n+1
n+1
n
n
uj,l
= 1/4(uj+1,l
+ uj1,l
+ uj,l+1
+ uj,l1
)
Just an averages of the neighboring points.

Yann - [email protected] (SCV)

Scientific Python

October 2012

61 / 76

Solve Laplaces Equation 1c


Solve 2 u = 0
Solve iteratively, each time changing u with
following equation:
n+1
n+1
n+1
n
n
uj,l
= 1/4(uj+1,l
+ uj1,l
+ uj,l+1
+ uj,l1
)
Just an averages of the neighboring points.

Yann - [email protected] (SCV)

Scientific Python

October 2012

62 / 76

Solve Laplaces Equation 1d


Solve 2 u = 0
Solve iteratively, each time changing u with
following equation:
n+1
n+1
n+1
n
n
uj,l
= 1/4(uj+1,l
+ uj1,l
+ uj,l+1
+ uj,l1
)
Just an average of the neighboring points.
Repeat this calculation until rms(u n+1 u n ) < ,
some threshold
Set some limit on total number of iterations
practice/laplace.py

Yann - [email protected] (SCV)

Scientific Python

October 2012

63 / 76

Solve Laplaces Equation 2


First task:

19 def pu r e _ p y t h o n _ s t e p ( u ):
20
Pure python imple mentati on of Gauss - Siedel method . Performs
21
iteration .
22
rms_err = 0
23
# use for loop to loop through each element in u
24
#
temporarily store old value to later calculate rms_err
25
#
update current u using 4 point averaging
26
#
update running value of rms_err
27
# when done looping complete rms_err calculation and return it
28
return rms_err

Yann - [email protected] (SCV)

Scientific Python

October 2012

64 / 76

Slicing - 1

19
20
21
22
23
24
25

x = np . array ((1 , 2 , 3 , 4 , 5 , 6))


x [2]
x [2:5]
x [2: -1]
x [:5]
x [:5:2] = 10
x

Yann - [email protected] (SCV)

Scientific Python

October 2012

65 / 76

Slicing - 2
29
30
31
32
33
34
35
36
37
38
39
40

>>> x = np . array ((1 , 2 , 3 , 4 , 5 , 6))


>>> x [2]
3
>>> x [2:5]
array ([3 , 4 , 5])
>>> x [2: -1]
array ([3 , 4 , 5])
>>> x [:5]
array ([1 , 2 , 3 , 4 , 5])
>>> x [:5:2] = 10
>>> x
array ([10 , 2 , 10 , 4 , 10 , 6])

Yann - [email protected] (SCV)

Scientific Python

October 2012

66 / 76

Array Copying
43
44
45
46
47
48
49
50
51
52
53
54
55

>>> a = np . array ((1 ,2 ,3 ,4))


>>> b = a
>>> b is a
True
>>> c = a . view ()
>>> c . shape = 2 ,2
>>> c [1 ,1]=10
>>> c
array ([[ 1 , 2] ,
[ 3 , 10]])
>>> a
array ([ 1 , 2 , 3 , 10])
>>> d = a . copy ()

Yann - [email protected] (SCV)

Scientific Python

October 2012

67 / 76

Solve Laplaces Equation 3a

Yann - [email protected] (SCV)

Scientific Python

October 2012

68 / 76

Solve Laplaces Equation 3b

Yann - [email protected] (SCV)

Scientific Python

October 2012

69 / 76

Solve Laplaces Equation 3c

Yann - [email protected] (SCV)

Scientific Python

October 2012

70 / 76

Solve Laplaces Equation 3d


Second task:

35 def numpy_step ( u ):
36
Numpy based Jacobi s method . Performs one iteration .
37
# make a copy so that you can calculate the error
38
u_old = u . copy ()
39
# use slicing to shift array
40
# utmp = u [1: -1 , 1: -1] makes a new array , so that utmp [0 ,0] is
41
# as u [1 ,1]
42
# then
43
# utmp = u [0: -2 , 1: -1] makes a new array that leads to a shift
44
# because utmp [0 ,0] is the same as u [0 , 1]
45
# use this concept to solve this equation in on line
46
# u = 1/4*( u_ {j -1 , i } + u_ { j +1 , i } + u_ {j , i -1} + u_ {j , i +1})
47
return calc_err (u , u_old )

Yann - [email protected] (SCV)

Scientific Python

October 2012

71 / 76

Solve Laplaces Equation 4a


Third task:

4 def laplace _driver (u , stepper , maxit =100 , err =1 e3 ):


5
Repeatedly call stepper ( u ) to solve nabla ^2 u = 0 until
6
rms error < err or maxit number of iterations is reached .
7
8
u - a numpy array
9
stepper - a function whose sole argument is u
10

11
rms_err = 0
12
# take one step with stepper , to define initial rms_err
13
# loop until rms_err < err
14
#
check to see that number of iterations is less than maxi
15
#
perform single iteration using stepper method
16
# return rms_error
17
return rms_err

Yann - [email protected] (SCV)

Scientific Python

October 2012

72 / 76

Solve Laplaces Equation 4b

59 def time_method ( stepper ):


60
Time how long a particular stepper takes to solve an ideal
61
u = set_bc ( np . zeros ((100 ,100)))
62
start = time . time ()
63
err = la place_dr iver (u , stepper )
64
return time . time () - start
65
66 if __name__ == " __main__ " :
67
p u r e _ p y t h o n _ t i m e = time_method ( p u r e _ p y t h o n _ s t e p )
68
numpy_time = time_method ( numpy_step )
69
print " Pure python method takes {:.3 f } seconds " . format ( p u r e _ p y
70
print " Numpy method takes {:.3 f } seconds " . format ( numpy_time )

Yann - [email protected] (SCV)

Scientific Python

October 2012

73 / 76

Solve Laplaces Results

1 Pure python method takes 3.624 seconds


2 Numpy method takes 0.016 seconds

Yann - [email protected] (SCV)

Scientific Python

October 2012

74 / 76

Resources

SCV help site


Numpy Tutorial
Scipy tutorial
Scientific Python Tutorial
Another Scientific Python Tutorial
iPython Tutorial

Yann - [email protected] (SCV)

Scientific Python

October 2012

75 / 76

What I Didnt Cover

Exception Handling
Duck Typing
Virtualenv
Pandas
mpi4py
And many other useful things

Yann - [email protected] (SCV)

Scientific Python

October 2012

76 / 76

You might also like