Skip to content

Instantly share code, notes, and snippets.

@jminas
Created September 24, 2013 19:22
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jminas/6689918 to your computer and use it in GitHub Desktop.
Save jminas/6689918 to your computer and use it in GitHub Desktop.
test
{
"metadata": {
"name": ""
},
"nbformat": 3,
"nbformat_minor": 0,
"worksheets": [
{
"cells": [
{
"cell_type": "code",
"collapsed": false,
"input": [
"# import some things\n",
"%pylab --no-import-all inline\n",
"import numpy as np\n",
"import pylab as pl\n",
"from scipy import linalg"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"Populating the interactive namespace from numpy and matplotlib\n"
]
}
],
"prompt_number": 180
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"Python for Scientific Computing\n",
"===============================\n",
"\n",
"<img src=\"http://www.python.org/images/python-logo.gif\">\n",
"<img src=\"http://www.scipy.org/_static/images/scipy_med.png\">\n",
"\n",
"**Martin Luessi**\n",
"\n",
"**Martinos Center \"Why N' How\", September 19, 2013**"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"What is Python and why would I use it?\n",
"--------------------------------------\n",
"\n",
"- Python is an **intepreted high-level programming language**\n",
"- Python is **free** (as in speech)\n",
"- Python runs on most platforms\n",
"- It [**\"combines remarkable power with very clear syntax\"**](http://docs.python.org/faq/general.html#what-is-python)\n",
"- Well suited for **high performance numerical computing** (NumPy, ...)\n",
"- High quality **2D and 3D visualizations** (pylab, mlab, ...)\n",
"- Increasingly **popular in neuroscience** (nipy, nipype, nitime, ...)"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"What you should be able to do after this talk\n",
"---------------------------------------------\n",
"\n",
"- Start Python\n",
"- Do simple math\n",
"- Get started with linear algebra and scientific computing\n",
"- Plot some nice figures"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"Use Python for what?\n",
"--------------------\n",
"\n",
"- Scripting (like shell scripts, e.g., bash, csh)\n",
"- Make web sites\n",
"- Build GUI applications\n",
"- **Science** (like Matlab, IDL, R, Octave, Scilab)\n",
"- Etc.\n",
"\n",
"**You just need to know one language to do almost anything !**\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"Scientific Python building blocks\n",
"---------------------------------\n",
"\n",
"* **Python interpreter**: executes Python code\n",
"\n",
"* [**IPython**](http://ipython.org): an advanced **Python shell**\n",
"\n",
"* [**NumPy**](http://www.numpy.org): provides **numerical array** objects\n",
"\n",
"* [**SciPy**](http://www.scipy.org/): scientific computing\n",
" (linear algebra, optimization, regression, etc.)\n",
"\n",
"* [**Matplotlib**](http://matplotlib.org) a.k.a. Pylab: 2-D visualization, \"publication-ready\" plots\n",
"\n",
"* [**Mayavi**](http://mayavi.sourceforge.net) : 3-D visualization\n",
"\n",
"* Many application specific packages for e.g., machine learning,\n",
" image processing, symbolic math, .. [incomplete list](http://www.scipy.org/Topical_Software)\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"First Steps\n",
"-----------\n",
"\n",
"Get a scientific-Python environment:\n",
"\n",
"* Comes with every Linux distribution\n",
"* Python(x,y) on Windows: http://www.pythonxy.com\n",
"* Enthought Canopy or EPD: http://www.enthought.com\n",
"* Continuum Analytics Anaconda http://www.continuum.io\n",
"* At the Martinos Center use the EPD based network installation, see [here](http://surfer.nmr.mgh.harvard.edu/fswiki/DevelopersGuide/NMRCenterPython/UsersGuide\n",
")\n",
"\n",
"Start the **IPython shell** (from terminal or Windows cmd shell):\n",
"\n",
" $ ipython --pylab"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"Hello world!\n",
"------------\n",
"\n",
"The IPython Shell is an interactive shell:\n",
"\n",
"<img src=\"http://ipython.org/ipython-doc/stable/_images/colors_dark.png\" width=\"400\" height=\"400\"/> \n",
"\n",
"Now we can write our \"Hello World\" program by typing:"
]
},
{
"cell_type": "code",
"collapsed": true,
"input": [
"s = \"Hello World!\"\n",
"print s"
],
"language": "python",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"Hello World!\n"
]
}
],
"prompt_number": 181
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"My first script\n",
"---------------\n",
"\n",
"Let's say the file ``my_script.py`` contains:\n",
"\n",
" s = 'Hello World!'\n",
" print s\n",
" \n",
"In IPython you can run it as follows:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"%run my_script.py"
],
"language": "python",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"Hello World!\n"
]
}
],
"prompt_number": 182
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"If you are scared of the terminal\n",
"---------------------------------\n",
"\n",
"You can use [**Spyder**](http://code.google.com/p/spyderlib), a scientific Python IDE.\n",
"Or the [**IPython Notebook**](http://ipython.org/notebook.html)\n",
"\n",
"\n",
"<div style=\"float: left\">\n",
"<img src=\"http://wiki.spyderlib.googlecode.com/hg/Screenshots/spyder-linux_small.png\" width=\"420\"/> \n",
"</div>\n",
"<div style=\"float: right\">\n",
"<img src=\"http://ipython.org/_images/9_home_fperez_prof_grants_1207-sloan-ipython_proposal_fig_ipython-notebook-specgram.png\" width=\"420\"/> \n",
"</div>\n",
"\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"source": [
"Start the **IPython Notebook** as follows\n",
"\n",
" $ ipython notebook --pylab=inline"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"Python basics: Numerical types\n",
"------------------------------\n",
"\n",
"Integer variables:\n",
"\n",
" >>> 1 + 1\n",
" 2\n",
" >>> a = 4\n",
"\n",
"floats:\n",
"\n",
" >>> c = 2.1\n",
"\n",
"complex (a native type in Python!):\n",
"\n",
" >>> a = 1.5 + 0.5j\n",
" >>> a.real\n",
" 1.5\n",
" >>> a.imag\n",
" 0.5"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"Python basics: Numerical types\n",
"------------------------------\n",
"\n",
"and booleans:\n",
"\n",
" >>> 3 < 4\n",
" True\n",
" >>> test = (3 > 4)\n",
" >>> test\n",
" False\n",
" >>> type(test)\n",
" <type 'bool'>\n",
"\n",
"Note that **you don't need to specify the type** of the variable\n",
"\n",
" int a = 1; # in C"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"Python basics: Numerical types\n",
"------------------------------\n",
"\n",
"Python can replace your pocket calculator with : ``+``, ``-``, ``*``, ``/``, ``%`` (modulo)\n",
"\n",
" >>> 7 * 3.\n",
" 21.0\n",
" >>> 2**10\n",
" 1024\n",
" >>> 8 % 3\n",
" 2\n",
"\n",
"**WARNING** : Integer division\n",
"\n",
" >>> 3 / 2 # !!!\n",
" 1\n",
" >>> 3 / 2. # Trick: use floats\n",
" 1.5\n",
" >>> 3 / float(2) # type conversion\n",
" 1.5"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"Strings\n",
"-------"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"my_str = 'Hello World!'\n",
"print my_str\n",
"print my_str[0]"
],
"language": "python",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"Hello World!\n",
"H\n"
]
}
],
"prompt_number": 183
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"source": [
"**Notice**: Indexing in Python starts at zero (like in C)"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"source": [
"Strings are **objects** with many useful **methods**:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"print my_str.replace('World', 'Why N\\' How')\n",
"print my_str.upper()"
],
"language": "python",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"Hello Why N' How!\n",
"HELLO WORLD!\n"
]
}
],
"prompt_number": 184
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"Container types: list\n",
"---------------------\n",
"\n",
"An **ordered** container that can hold arbitrart Python objects"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"my_list = [1, 2, 3, 'test'] # Notice: [] creates a list\n",
"print my_list"
],
"language": "python",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"[1, 2, 3, 'test']\n"
]
}
],
"prompt_number": 185
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"source": [
"We can append and insert things"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"my_list.append('test2')\n",
"print my_list\n",
"my_list.insert(1, 0)\n",
"print my_list\n"
],
"language": "python",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"[1, 2, 3, 'test', 'test2']\n",
"[1, 0, 2, 3, 'test', 'test2']\n"
]
}
],
"prompt_number": 186
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"Container types: list\n",
"---------------------\n",
"\n",
"We can access elements using their index"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"print my_list\n",
"print my_list[0] # first element\n",
"print my_list[-1] # last element\n",
"print my_list[-2] # second last element\n"
],
"language": "python",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"[1, 0, 2, 3, 'test', 'test2']\n",
"1\n",
"test2\n",
"test\n"
]
}
],
"prompt_number": 187
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"Container types: list\n",
"---------------------\n",
"\n",
"We can also use **slicing** to obtain sublists"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"print my_list\n",
"print my_list[2:5] # Notice: index 5 is not included"
],
"language": "python",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"[1, 0, 2, 3, 'test', 'test2']\n",
"[2, 3, 'test']\n"
]
}
],
"prompt_number": 188
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"source": [
"The slicing syntax is `l[start:stop:step]`. This can be very useful"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"print my_list[:3] # first 3 elements\n",
"print my_list[-3:] # last 3 elements\n",
"print my_list[::2] # every 2nd element\n",
"print my_list[::-1] # list with order reversed"
],
"language": "python",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"[1, 0, 2]\n",
"[3, 'test', 'test2']\n",
"[1, 2, 'test']\n",
"['test2', 'test', 3, 2, 0, 1]\n"
]
}
],
"prompt_number": 189
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"Container types: dictionary\n",
"---------------------------\n",
"\n",
"A dictionary (``dict``) is basically an efficient table that **maps keys to\n",
"values**. It is an **unordered** container:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"phone = {'joe': 554, 'bob': 308} # using {} creates a dict\n",
"print phone # Notice: no order"
],
"language": "python",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"{'bob': 308, 'joe': 554}\n"
]
}
],
"prompt_number": 190
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"source": [
"We can access elements using their **key**"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"print phone['joe']"
],
"language": "python",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"554\n"
]
}
],
"prompt_number": 191
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"source": [
"And add new elements (**Notice**: key does not have to be a string)"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"phone[0] = 101\n",
"print phone\n",
"print phone.keys() # list with the keys\n",
"print phone.values() # list with the values"
],
"language": "python",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"{0: 101, 'bob': 308, 'joe': 554}\n",
"[0, 'bob', 'joe']\n",
"[101, 308, 554]\n"
]
}
],
"prompt_number": 192
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"Basic control flow: Conditional statements\n",
"------------------------------------------\n",
"\n",
"Allow the conditional execution of code"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"a = 10\n",
"if a == 1:\n",
" print 1\n",
" print 22\n",
"elif a == 2:\n",
" print 2\n",
"else:\n",
" print 'a lot'"
],
"language": "python",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"a lot\n"
]
}
],
"prompt_number": 193
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"source": [
"**Notice**: Blocks are delimited by indentation (4 spaces)"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"Basic control flow: Loops\n",
"-----------------------------\n",
"\n",
"Can be used to iterate over lists, dicts, etc. For example:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"for word in ['cool', 'powerful', 'readable']:\n",
" print 'Python is %s !!!' % word"
],
"language": "python",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"Python is cool !!!\n",
"Python is powerful !!!\n",
"Python is readable !!!\n"
]
}
],
"prompt_number": 194
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"My first function\n",
"-----------------\n",
"\n",
"Functions are defined using **def**, they allow us to group code for specific tasks."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def disk_area(radius):\n",
" area = 3.14 * radius * radius\n",
" return area\n",
"\n",
"print disk_area(1.0)\n",
"print disk_area(2.0)"
],
"language": "python",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"3.14\n",
"12.56\n"
]
}
],
"prompt_number": 195
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"My second function\n",
"------------------\n",
"\n",
"**Arguments are not copied** when passed to a function (not like with Matlab)\n"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import copy\n",
"\n",
"def foo(a):\n",
" a.append(1) \n",
"\n",
"b = [0]\n",
"foo(b)\n",
"print b # a has been modified !!!"
],
"language": "python",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"[0, 1]\n"
]
}
],
"prompt_number": 196
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"NumPy: N-dimensional arrays in Python\n",
"-------------------------------------\n",
"\n",
"**NumPy** is:\n",
"\n",
"* An extension package to Python for multidimensional arrays (matrices in n-dimensions)\n",
"* Designed for **efficient** scientific computation\n",
"* Unlike Python lists, all elements of the array have the same type (int, float, etc)\n",
"\n",
"Reference documentation: http://docs.scipy.org/doc/numpy/reference\n",
"\n",
"For Matlab users: http://wiki.scipy.org/NumPy_for_Matlab_Users"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"NumPy: Creating arrays\n",
"----------------------"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import numpy as np # import numpy so we can use it\n",
"a = np.array([0, 1, 2, 3], dtype=np.float) # create array\n",
"print a\n",
"\n",
"print a.ndim # number of dimensions, in Matlab `ndims(a)`\n",
"print a.shape # shape, in Matlab `size(a)`\n",
"print a.dtype # the data type of the array"
],
"language": "python",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"[ 0. 1. 2. 3.]\n",
"1\n",
"(4,)\n",
"float64\n"
]
}
],
"prompt_number": 197
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"NumPy: Creating arrays\n",
"----------------------\n",
"\n",
"Arrays can have an arbitrary number of dimensions"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# 2-D array\n",
"b = np.array([[0, 1, 2], [3, 4, 5]]) # 2 x 3 array\n",
"print b\n",
"print b.dtype # Notice: here the data type is int64\n",
"print b.shape"
],
"language": "python",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"[[0 1 2]\n",
" [3 4 5]]\n",
"int64\n",
"(2, 3)\n"
]
}
],
"prompt_number": 198
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# 3-D\n",
"c = np.array([[[1], [2]], [[3], [4]]])\n",
"print c.shape # in Matlab `size(c)`"
],
"language": "python",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"(2, 2, 1)\n"
]
}
],
"prompt_number": 199
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"NumPy: Creating arrays\n",
"----------------------\n",
"\n",
"* Common arrays: **ones**, **zeros** and **eye** (like in Matlab)"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"a = np.ones((3, 3))\n",
"print a"
],
"language": "python",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"[[ 1. 1. 1.]\n",
" [ 1. 1. 1.]\n",
" [ 1. 1. 1.]]\n"
]
}
],
"prompt_number": 200
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"b = np.zeros((2, 3))\n",
"print b"
],
"language": "python",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"[[ 0. 0. 0.]\n",
" [ 0. 0. 0.]]\n"
]
}
],
"prompt_number": 201
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"c = np.eye(3)\n",
"print c"
],
"language": "python",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"[[ 1. 0. 0.]\n",
" [ 0. 1. 0.]\n",
" [ 0. 0. 1.]]\n"
]
}
],
"prompt_number": 202
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"NumPy: Indexing and slicing\n",
"---------------------------\n",
"\n",
"NumPy arrays can be **indexed** and **sliced** like Python lists"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"a = np.diag(np.arange(3))\n",
"print a"
],
"language": "python",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"[[0 0 0]\n",
" [0 1 0]\n",
" [0 0 2]]\n"
]
}
],
"prompt_number": 203
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"print a[1, 1]\n",
"print a[:,1] # takes the entire second row!"
],
"language": "python",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"1\n",
"[0 1 0]\n"
]
}
],
"prompt_number": 204
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# slicing\n",
"a = np.arange(10)\n",
"print a\n",
"print a[::2] # every 2nd element\n",
"print a[-5:] # last 5 elements"
],
"language": "python",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"[0 1 2 3 4 5 6 7 8 9]\n",
"[0 2 4 6 8]\n",
"[5 6 7 8 9]\n"
]
}
],
"prompt_number": 205
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"NumPy: Copies and views\n",
"-----------------------\n",
"\n",
"* A slicing operation creates a **view** on the original array"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"a = np.arange(10)\n",
"print a\n",
"b = a[::2]\n",
"print b"
],
"language": "python",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"[0 1 2 3 4 5 6 7 8 9]\n",
"[0 2 4 6 8]\n"
]
}
],
"prompt_number": 206
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"source": [
"* **The original array is not copied in memory: when modifying the view, the original array is modified as well.**"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"b[0] = 100\n",
"print b\n",
"print a # a was modified as well!"
],
"language": "python",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"[100 2 4 6 8]\n",
"[100 1 2 3 4 5 6 7 8 9]\n"
]
}
],
"prompt_number": 207
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"NumPy: Copies and views\n",
"-----------------------\n",
"\n",
"If you want a copy you have to specify it:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"a = np.arange(10)\n",
"b = a[::2].copy() # force a copy\n",
"b[0] = 100\n",
"print b\n",
"print a"
],
"language": "python",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"[100 2 4 6 8]\n",
"[0 1 2 3 4 5 6 7 8 9]\n"
]
}
],
"prompt_number": 208
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"source": [
"This behavior can be surprising at first sight...\n",
"\n",
"but it allows to **save both memory and time**."
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"NumPy: File formats\n",
"-------------------\n",
"\n",
"NumPy has its own file format for saving and loading arrays:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"a = np.arange(10)\n",
"np.save('test.npy', a)\n",
"a = 0\n",
"a = np.load('test.npy')\n",
"print a"
],
"language": "python",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"[0 1 2 3 4 5 6 7 8 9]\n"
]
}
],
"prompt_number": 209
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"source": [
"But Python supports well-known (& more obscure) file formats:\n",
" \n",
"* Matlab: ``scipy.io.loadmat``, ``scipy.io.savemat``\n",
"* HDF5: [``h5py``](http://code.google.com/p/h5py), [``PyTables``](http://pytables.org)\n",
"* NetCDF: ``scipy.io.netcdf_file``,\n",
"[``netcdf4-python``](http://code.google.com/p/netcdf4-python)\n",
"\n",
"* MatrixMarket: ``scipy.io.mmread``, ``scipy.io.mmread``\n",
".. "
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"NumPy: Linear algebra\n",
"---------------------\n",
"\n",
"Matrix multiplication:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"a = np.triu(np.ones((2, 2)), 1) # see help(np.triu)\n",
"print 'a:' + str(a)\n",
"b = np.diag([1, 2])\n",
"print 'b:' + str(b)\n",
"c = np.dot(a, b) # same as a.dot(b)\n",
"print 'c:' + str(c)"
],
"language": "python",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"a:[[ 0. 1.]\n",
" [ 0. 0.]]\n",
"b:[[1 0]\n",
" [0 2]]\n",
"c:[[ 0. 2.]\n",
" [ 0. 0.]]\n"
]
}
],
"prompt_number": 210
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"source": [
"**WARNING**: Element-wise multiplication vs. matrix multiplication"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"print a * b # element-wise multiplication"
],
"language": "python",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"[[ 0. 0.]\n",
" [ 0. 0.]]\n"
]
}
],
"prompt_number": 211
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"NumPy: Linear algebra\n",
"---------------------\n",
"\n",
"Transpose:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"a_t = a.T\n",
"print a_t"
],
"language": "python",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"[[ 0. 0.]\n",
" [ 1. 0.]]\n"
]
}
],
"prompt_number": 212
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"source": [
"Note: As with slicing, there is no copy. We can verify this by inspecting the arrays:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"print 'a.flags:\\n' + str(a.flags)\n",
"print 'a_t.flags:\\n' + str(a_t.flags)"
],
"language": "python",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"a.flags:\n",
" C_CONTIGUOUS : True\n",
" F_CONTIGUOUS : False\n",
" OWNDATA : True\n",
" WRITEABLE : True\n",
" ALIGNED : True\n",
" UPDATEIFCOPY : False\n",
"a_t.flags:\n",
" C_CONTIGUOUS : False\n",
" F_CONTIGUOUS : True\n",
" OWNDATA : False\n",
" WRITEABLE : True\n",
" ALIGNED : True\n",
" UPDATEIFCOPY : False\n"
]
}
],
"prompt_number": 213
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"NumPy: Linear algebra\n",
"---------------------\n",
"\n",
"Inverse, systems of linear equations and SVD:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"from numpy import linalg # OR\n",
"from scipy import linalg # even better\n",
"A = np.triu(np.ones((3, 3)), 0)\n",
"print 'A:\\n' + str(A)\n",
"B = linalg.inv(A)\n",
"C = np.dot(B, A)\n",
"print 'C:\\n' + str(C)\n",
"x = linalg.solve(A, [1, 2, 3]) # linear system\n",
"U, s, V = linalg.svd(A) # SVD\n",
"vals = linalg.eigvals(A) # Eigenvalues"
],
"language": "python",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"A:\n",
"[[ 1. 1. 1.]\n",
" [ 0. 1. 1.]\n",
" [ 0. 0. 1.]]\n",
"C:\n",
"[[ 1. 0. 0.]\n",
" [ 0. 1. 0.]\n",
" [ 0. 0. 1.]]\n"
]
}
],
"prompt_number": 214
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"NumPy: Reductions\n",
"-----------------\n",
"\n",
"Computing sums:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"x = np.arange(5)\n",
"print x\n",
"print np.sum(x) # or x.sum()\n",
" "
],
"language": "python",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"[0 1 2 3 4]\n",
"10\n"
]
}
],
"prompt_number": 215
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"source": [
"Sum by rows and by columns:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"x = np.array([[1, 1], [2, 2]])\n",
"print np.sum(x, axis=0), # columns (first dimension)\n",
"print np.sum(x, axis=1) # rows (second dimension)"
],
"language": "python",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"[3 3] [2 4]\n"
]
}
],
"prompt_number": 216
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"source": [
"Same with ``np.mean, np.argmax, np.argmin, np.min, np.max, np.cumsum, np.sort`` etc."
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"SciPy\n",
"-----\n",
"\n",
"* ``scipy`` contains various toolboxes dedicated to common issues in scientific computing.\n",
"\n",
"* ``scipy`` can be compared to other standard scientific-computing libraries, such as the GSL (GNU Scientific Library for C and C++), or Matlab's toolboxes.\n",
"\n",
"* ``scipy`` is the core package for scientific routines in Python.\n",
"\n",
"* ``scipy`` is meant to operate efficiently on ``numpy`` arrays."
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"SciPy\n",
"-----\n",
"\n",
"* ``scipy.io`` for IO (e.g. read / write Matlab files)\n",
"* ``scipy.linalg`` for optimized linear algebra\n",
"* ``scipy.stats`` for basic stats (t-tests, simple anova, ranksum etc.)\n",
"* ``scipy.signal`` for signal processing\n",
"* ``scipy.sparse`` for sparse matrices\n",
"* ``scipy.fftpack`` for FFTs\n",
"* ``scipy.ndimage`` for N-D image processing (e.g., smoothing)\n",
"* etc."
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"SciPy: Example of ``scipy.stats``\n",
"---------------------------------\n",
"\n",
"A T-test to decide whether the two sets of observations have different means:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"from scipy import stats\n",
"a = np.random.normal(0, 1, size=10)\n",
"b = np.random.normal(1, 1, size=10)\n",
"tval, pval = stats.ttest_ind(a, b)\n",
"print 'T=%0.4f, p=%0.4f' % (tval, pval)"
],
"language": "python",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"T=-3.0062, p=0.0076\n"
]
}
],
"prompt_number": 217
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"Visualization with Python\n",
"-------------------------\n",
"\n",
"Matplotlib provides functions to create publication-quality figures"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import pylab as pl\n",
"t = np.linspace(0, 8 * np.pi, 1000)\n",
"pl.plot(t, np.sin(t))\n",
"pl.xlabel('$x$')\n",
"pl.ylabel('$sin(x)$')\n",
"pl.ylim([-1.1, 1.1])\n",
"pl.savefig('pylab_demo.pdf') # natively save pdf, svg, etc."
],
"language": "python",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"outputs": [
{
"metadata": {},
"output_type": "display_data",
"png": "iVBORw0KGgoAAAANSUhEUgAAAZIAAAEKCAYAAAA4t9PUAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJztnXt0F+WZx7+/XAiESwAhIeRCEpIQIJAEgWAVDYVgEY1Y\ndAWPLhXsemzZ7u5xPbrdeha3rque1tYuu91qt0pPleINpQKpoETuRrlDEAgkIXcJECBAIJfZPx4n\nJPlNkt9lZt533nk+53gkv9/83nnmmZnn+z7v1aNpmgaGYRiGCZAQ0QYwDMMwzoaFhGEYhgkKFhKG\nYRgmKFhIGIZhmKBgIWEYhmGCgoWEYRiGCYow0QZYSXZ2Ng4cOCDaDIZhGEeRlZWF/fv3+3y80hnJ\ngQMHoGmasv/927/9m3Ab+Nr4+vj61PvP3wq40kLCMAzDWA8LCcMwDBMULCQOJi8vT7QJlqHytQF8\nfU5H9evzF4+madKttbV06VKsX78e0dHROHTokOExP/nJT7Bx40ZERkbizTffRE5OjtcxHo8HEl4e\nwzCM1PgbO6XMSB599FEUFhb2+P2GDRtQWlqKEydO4LXXXsMTTzxho3UMwzBMZ6QUkpkzZ2LYsGE9\nfr9u3TosWbIEAJCbm4vGxkbU19fbZR7DMAzTCSmFpC+qq6uRkJDQ8Xd8fDyqqqoEWsQwDONeHCkk\nALza7zwej6nlX74M/PM/AwUFwGefmVq0o2lpAX7+c2D+fODdd0VbIw+aBqxcCdx1F/C//0t/M8Tq\n1eSX//xPoLVVtDWMFThyZntcXBwqKys7/q6qqkJcXJzhsStWrOj4d15enk+jLdrbgQceAKKigPvv\nBxYvBt55B7jjjmAtdz5///dAaSnwwx+S0La1AYsWibZKPC++SM/Iv/4rCe2FC8DTT4u2SjxvvUU+\nefll4Le/BU6fpv8zclFUVISioqLAC9AkpaysTMvMzDT8bv369dq8efM0TdO0Xbt2abm5uYbHBXp5\nv/+9puXmatr16/r5NC0l5cbfbmXTJvLDhQv091dfaVpMjKadPSvWLtEcPappI0ZoWlUV/V1ZqWk3\n3aRpJ0+KtUs0DQ3kh4MH6e+LFzUtPl7Tdu4UaxfTN/7GTimH/y5evBiff/45GhoaEBMTg+eeew4t\nLS0AgMcffxwAsHz5chQWFmLgwIF44403MGXKFK9yAhn+29ICpKdTTeo737nx+Xe/C/zt3wI/+EHA\nl+VoNA249VbKSBYvvvH5Y48B8fFAp8TPdSxaBGRnA888c+Ozn/+cMrdVq8TZJZqnnwYuXQL+539u\nfLZqFfDmm8CWLcLMYnzA39gppZCYRSBC8v77wKuvAlu3dv180yZqynHrGpB79lAzX2kpEBp64/OS\nEmD2bKCiAujXT5x9oqirA8aPpyabwYNvfH72LJCaCpw4AYwYIc4+UTQ3AwkJQHExkJx84/OWFiAx\nEdi8GZg4UZx9TO8oMY9EJKtWAUuXen8+ezbQ2OheIXnjDeDRR7uKCABMmACMGwds2CDGLtGsWgV8\n//tdRQQAbrqJBmr86U9i7BLN2rVATk5XEQGA8HDKYn//ezF2MdbAQtKJc+eAzz8HFi70/i4kBHj4\nYWrychttbcCaNcAjjxh//+CD7h3B9c479FwYsWgR8N579tojC++9Bzz0kPF3ixfT9+3t9trEWAcL\nSSc++QS4/Xbv2qXOggXA+vX22iQDxcVAbKx37VLn+98nv1y7Zq9doqmuBsrKgNtuM/5+9mxq+quu\nttcu0TQ3U9PV/PnG348fDwwcCHz1lb12MdbBQtKJDRt6fvgB4OabgTNngPJy20ySgvXre/dLTAyQ\nkQHs3GmfTTKwfj3wve9Rc40R/foB+flUQXETW7YAkycDI0caf+/xAPfeC3z8sb12MdbBQvItbW1A\nYSFNnOqJkBAKHBs32meXDHz8MXD33b0fM2cODUhwE776ZfNme+yRhfXrffMLT/RVBxaSb9m/n0bX\nJCb2fty8ecBf/2qPTTLQ0EDNN7m5vR+Xn++ugNnWRiP75szp/bg5c4BPP3XXTPeiImrW641bb6WB\nK01NtpjEWAwLybds3+7bzPXbb6dj3RIYtm8HbrkFCOtjDYQZM4Cvv6YBC27g0CFg1CggOrr345KT\nqT/gyBF77BJNQwMNhc7O7v24yEhg6lTvYfaMM2Eh+Zbt23vuNO1MXBx1xh87Zr1NMrB9OzBzZt/H\nRUQA06cDu3dbb5MMbN1KlQpfyMuj0YBuYPt2msjbV8UDAGbN4omJqsBCAsoufBUSgNLy7duttUkW\ntm3zTUgAykp27bLWHlnwxy+33AJ88YW19sjC1q2+r0nnJr+oDgsJgFOnqAbVV/+Izm23ATt2WGuT\nDFy5Ahw+DEyb5tvxt9zinoxkxw7fKx4zZrjHLzt3dl1aqDemTwf27eMVgVWAhQRUK5oxg4Yl+sJ3\nvuOOoa7799PM9QEDfDs+N5fmnLS1WWuXaGpqaKmPpCTfjh8/Hqivp2VTVKa1lfqODJa9MyQqipZR\nOXzYWrsY62EhAbB3r+8PP0CBobJS/REne/fS3BlfGTGC5pSUlFhnkwzs2UPPi68Vj9BQyupUb8Yp\nKSFh6GlCrxG5uer7xQ2wkMB/IQkPBzIz1V93Sw+Y/jB1KvlTZfbs8U9gAWrGKS62xh5ZCMQvLCRq\n4Hoh0TRqp83J8e93OTnqB0x/BRagYZ/791tjjywEEjCzs91R8fDXLzk56j8vbsD1QlJeTuP8+5oP\n0J0pU0iAVKW5mZZAz8z073dZWeoHTH+b/ABaMkR1vwQiJJmZNP/o2+2GGIfieiEJpNYNqJ+RHDxI\ny8P37+/f7/Sat6oTNuvqSGTHjPHvd2lp1OF+8aI1dommtZWeGX8z+4EDaWO048etsYuxBxaSAIVk\n0iR6+FVd8TZQv8TEUB9SVZX5NsnA3r0ULH3taNcJDaWNnA4etMYu0Rw7BoweDQwZ4v9v3ZDFqo7r\nhWT//r6XczBiwABg7Fh1l744dIiaYwJB5cBw+DBVIgJBZb8cOeJ/M6iOG5r9VMf1QlJSEviWn5mZ\n6gpJMH5RuWP5yJHA/cJCYkxWlrqZmltwtZBcvkzt1j1t2NQXEyaoO2eipISuLxBUD5gsJN6wX9yN\nq4Xk2DHqBPVlgTkjVBWShgbq+4mNDez3qvqlvR04ejRwgc3MJL+oOBDh8OHAhSQxkSp1DQ3m2sTY\nh6uFpKSEZqkHysSJagZMPVj626GsM24ccPKkemsolZcDw4fT0h6BMGwYjVJSbevda9eAigq674Hg\n8dB7+PXX5trF2IfrhSTQ2iVAne1VVcDVq+bZJAPB+mXAAMpmysrMs0kGgmm+0cnIUC9gHjtGzcP9\n+gVehop+cRMsJEEEzPBwEhPV9iYJ1i8ABYajR82xRxbMEJLx49XzSzDNWjosJM7G1UISTHu3jor9\nAWYIiYoBkzMSY8x6XlTzi5twrZBcu0ZbgqamBleOiv0kLCTGHDtGQhAMKvrl+PHg/aKiwLoJ1wrJ\n8eO0n0Qw7bqAei9AYyMt45GQEFw5qgVMTaO1x9LTgytHtecFIL+kpQVXRkoK9Tc2N5tjE2MvrhWS\no0eDG7Glk5pKL5IqHDtGo28CHbGlowdMVYa6NjSQT266Kbhy4uNJqC9cMMcu0egCG6yQhIdTh71K\n75KbcK2QnDgR+HDFzqSlAaWl6gTM0tLggwJAATcighY5VAE9WAYrsCEh9Nypkq3V1NCQ5kCHRHeG\n+0mci2uFpLQ0+P4RgBapGzSIXigVMMsvAJVTWmpOWaIxo9atM26cWn4JtrlPZ9w4FhKn4mohGTvW\nnLLS0tRJyVlIjDl+3LyAOXYs+8WI1FSayMo4D1cLiVkBk4XEGJWExMyMhP1iDAuJc3GlkDQ1UWfn\n6NHmlMdCYoxqAZNr3t5wpsYALhWSkydpuGGISVevipA0NtLwS3+3He4JVYTErJFJOqr4BTBXYEeP\npgpeU5M55TH24UohMbPWDagjJLpfgh2ZpKPXvJ0+oq22lkYmBbL7nxHR0STYjY3mlCeKtjZaT82s\nvsaQEKrgnTplTnmMfbCQmEBqKj387e3mlSkCs/0yfDgFh7NnzStTBGY23wAk1GPHOr956/RpEsUB\nA8wrk5u3nAkLiQkMGgQMHer85cHN9gugRjMO+8WYkyfNy0Z0VPCLG3GlkJw8aX5gUKF5y4qAqUIN\n89QpanIxExUC5qlTge8u2hMqZGpuxJVCYkXAVKFtl2vexpSXmx8wVRi5VVZmjV+c/ry4EdcJydWr\nwDffBL8oYXeSk52/kRMLiTFWBEwVMjUWEkbHdUJSVgaMGQOEhppbblKSs4Xk0iVaTDDQfdp7ggOm\nMSos9mmFXxITaX22a9fMLZexFtcJiZlLo3QmOZmaQJyK3t5t1twaHaf75coVmtswapS55cbFAefP\nO3ubZiuEJCyMWgucXClzI1IKSWFhITIyMpCWloaXXnrJ6/uioiJERUUhJycHOTk5eP75530uu6zM\n/I5TwPlNW1b0AwCU4TQ2OjdglpdTLdlsgQ0JoYB5+rS55dpFUxP9Z7bAAvQcVlSYXy5jHWGiDehO\nW1sbli9fjs2bNyMuLg7Tpk1DQUEBxnfbPOSOO+7AunXr/C6/ooKaocxm9OgbNUwzx9XbhVV+CQmh\nQFxREfwueiKwotatozeHmrGdgd2Ul1MTsVmTVzuTlOTsLNaNSJeRFBcXIzU1FUlJSQgPD8eiRYvw\n0UcfeR2nBThdurzc2oDp1BfAKr8Azu4/slpInPq8sF+YzkgnJNXV1UjoNKQqPj4e1d1m+nk8Huzc\nuRNZWVm46667UOLHpulWBkwnN29ZLSRODQxWBkwn9x+xkDCdka5py+NDrjxlyhRUVlYiMjISGzdu\nxIIFC3D8+HHDY1esWNHx77y8PJSX52HMGLOs7YqTXwAWEmPKyoAZM6wpOykJCKB1VgpYSNSiqKgI\nRUVFAf9eOiGJi4tDZWVlx9+VlZWIj4/vcszgwYM7/j1v3jz86Ec/wrlz5zB8+HCv8joLycWLNKxw\nxAjz7QY4I+mJ5GTgww+tKdtqrBqEADg7YJaVATNnWlO2k/3iVPLy8pCXl9fx93PPPefX76Vr2po6\ndSpOnDiB8vJyXL9+HWvWrEFBQUGXY+rr6zv6SIqLi6FpmqGIdEfvULaigxBwrpBcuABcv077rFsB\n95EY4+SAaaVfYmOdPzTabUiXkYSFhWHlypW488470dbWhmXLlmH8+PH43e9+BwB4/PHH8d577+G3\nv/0twsLCEBkZiT//+c8+lW1lrRtwrpBYLbBODZiNjUBrK61ibAWjRt0YGu2kkX6aZq2QdB4a7cQR\nbW5EOiEBqLlq3rx5XT57/PHHO/794x//GD/+8Y/9LlcfsmgVThUSq/0SE0Mz5y9fpn09nIIeLK0S\nWKcOjT57llaGGDrUunPolQ8WEmcgXdOWlVg1V0JnxAhqIrpwwbpzWIHVfgkJIaFyWlZiZa1bx4nZ\nGvuF6Y6rhMTqpi2Px5kvgNV+AZzpF7sCptOyWBYSpjssJCbjxLkBLCTG2BEw+XkxxonPi5thITGZ\nxESg0+hlR8CBwZjTp63tOwKc6ZfKSnrOrcSJfnEzrhGSpiZayXXkSGvP48SF+OwSEqc14VRWmr9v\nTXecGDArK4FuU7tMx4l+cTOuEZKKCusWmetMYqKzhOTiRaC52bpJmjpjxjjLL4B9QsIC6w3PJXEW\nrhESO2rdgPOExOo5JDpO88uVK5TFWi2wMTE0yq+52drzmIkdQhISQlmPk54ZN8NCYjJOC5hWD/3V\nGTUKOHfOOTvfVVXR5lNm70PSnZAQOk9VlbXnMYvmZhK+mBjrz+XE/ka34hoh0Zu2rGb0aNoTvqXF\n+nOZgb5xk9WEhpJvnBIw7ah16zip8lFdTffRaoEFyP8sJM7ANUJy+rQ9ATMsjGrf3Va+l5aqKvsC\nppMCg51Cwn4xxkkC63ZcIyT8AhjDfjHGboF1il9YYBkjWEgswEltuxwYjOHnxRh+XhgjXCEkbW1A\nXR217dqBk2redswJ0HGaXzhgesPPC2OEK4Sktpb22ujXz57zOeUFaG8HamrsCwxOC5jc5OeNCIH9\ndushRmJcISR2tncDzgkM33wDREUB/fvbcz6n+AWwt+at95E4IWDaKSRDhtBov/Pn7TkfEziuEBI7\nH37AOZ2nIvzihIzk0iXaDsCqDa26ExVFE0KdsP2A3c+Mk/qP3AwLiQU4peZtZ60bAIYNo/4q2QOm\n/rxYPdtfx+NxhshevkxLllg9278zTvALw0JiCUOHUv+D7AHT7iY/pwRMu58XwBmVj6oqqnjYJbCA\nM/zCsJBYgsfjjBdAVMCUXUjsFliABbYnnOAXxkVCYmcTDsBC0hNO6D/igGkMPy9MT7hCSETUMJ1Q\n8xYlsE7wCzdtecPPC9MTygtJSwtw5gztb2AnTggMoppwZPeLiIDJGYkxTvAL4wIhqamhJa/Dwuw9\nr+xCos/2j4uz97xOqGFyRmKMCL/Ex9M73NZm73kZ/1BeSEQ8/AAFhooK+8/rK3V1NE/Crtn+OrJn\nJJomLmBWV9NoP1kR4ZeICBo2Xl9v73kZ/2AhsQjZU3IRzTcA+UXmgNnYSHttREXZe97+/WnYuMwB\nk98lpidcISQiAmZcHK3xJWtKLqJ/BAAGDAAGD6Z+KxkRFSwBuQPmhQsk/kOH2n9uJzT7uR3lhURU\nwJQ9JRcZMGUODKL9IquQ6O+RnZMRdWQWWIZQXki4hmmMqEwNkNsvoioegNz9R6IFVla/MAQLiYXI\nHDA5MBjDz4sxXPFgeoOFxEJkfgHYL8aIDJgssMbI/LwwhPJC0thI80hEIPMLILoJR1a/cMA0hjNY\npjeUF5LYWBrOKQJZA0NrK21qZfdsfx1Z/QKwkPSESL/ExNDmVteuiTk/0zfKC4moh18/t4yBoaYG\nGDkSCA8Xc35Z/aJpYjO12FigoYE21ZINkUISGkq+qa4Wc36mb1hILD63jCm5yKAAAKNHU0bU2irO\nBiMaGmiey8CBYs4fGgqMGkVCLxOiZvt3Jj5ezsoHQ7CQWIisNUyRtW6A1j2LjpYvYIoOloCcAfPc\nOVpKZ/BgcTbImsUyhM9LGV69ehWrV6/GoUOH0NraiitXriAkJASDBw9Gbm4uHnjgAYSI6ozoBdEB\nMyaGAmZSkjg7uiNyZJKOHhgSE8Xa0RnRAgvQ+auqxNrQHfYL0xc+CcnmzZtRUlKC+fPnY+nSpV2+\n0zQNBw8exK9//WvMnj0bWVlZlhgaKKIDpj5bWTYhGTNGrA0y1jBlyEhk9Yvo9yghAfj6a7E2MD3T\np5A0NzcjKSkJc+bMAQCcOnUKsbGxGDBgAADA4/EgKysLWVlZOHLkiLXWBgAHBm8qK4HbbhNrg6x+\nkSFglpaKtaE7sgjspk1ibWB6ps+2qP79+yM1NbXj71/+8pf44osvAADbtm3Dtm3bOr6bOHGiBSYG\nhwwvgGwBU5amCtn8IkvAZL94I6NfmBv43akxffp0lJWVoaysDDNnzkRDQ4MVdpnGyJFizy/jCyBL\nzVtGv3DA9Ib9wvSF30JSWVmJiIgIvPLKK5g1axb27NljhV2mIWK10s7I9gJcvw6cPStuMqKObH4B\nOGD2hAx+GTkSaGoCrlwRawdjjN8b0KakpGDhwoV46KGH0NDQgA8++MAKu5RBtsBQXU1zFUJDxdoh\nm1/a22l0nehMLTqa9v5obqbNrmRABiHxeOjeVFUB6elibWG88TsjefDBBzs61cvKylBvwYYbhYWF\nyMjIQFpaGl566SXDY37yk58gLS0NWVlZ2Ldvn+k2mIVsAVOG/hGAAqZMy17U19OuiKKDd0gITdiU\nZahreztVPkQLLCDfu8TcoE8huXbtWpd+kNDQUEyZMgUAMG3aNDz77LMd3502YRp3W1sbli9fjsLC\nQpSUlGD16tU4evRol2M2bNiA0tJSnDhxAq+99hqeeOKJoM9rFSNHApcuAVeviraEkKF/BKCMSKaA\nKUOtW0emgHnmDDBoEBAZKdoSOSdrMkSfQhIREYHdu3fj7bffxtUeouH58+fx2muvoaKiImiDiouL\nkZqaiqSkJISHh2PRokX46KOPuhyzbt06LFmyBACQm5uLxsZGSzIjMwgJoW13OWB6I1PAlCVTA+Sa\nfCebX2R5Xpiu+NRHcvfdd6O2tha/+tWv8M0336C5uRktLS0IDQ1FZGQk4uPj8cMf/hBRUVFBG1Rd\nXY2ETk9ufHx8x3Dj3o6pqqpCjKj14vtAX3MrLU20JfQiymAHIFdgkCVTA9gvPZGQAMjSil1XR+/0\n9OmiLZEDnzvbY2Nj8dOf/tRKWwDQBEdf0DTNp9+tWLGi4995eXnIy8sL1LSAkSkwVFUB3/2uaCsI\nmfwiW6Z2+LBoKwjZ/PKXv4i2gigqAt5/H3j3XdGWmENRURGKiooC/r3fo7Y6s2vXLiQkJCDexCpL\nXFwcKjtFl8rKSq/yux9TVVWFuLg4w/I6C4koZAuYMtUwS0pEW0FUVgLfdv0JJyEB2LhRtBWEbEIi\ny3skU5OfGXSvZD/33HN+/d7vUVvPP/88lixZgmXLlqGiogLvv/++v0X0ytSpU3HixAmUl5fj+vXr\nWLNmDQoKCrocU1BQgD/+8Y8AgN27d2Po0KHSNmsBcr0AHBiMYb8Yw34xRqYKmQz4nZFMnDgRP/vZ\nz3DhwgVs2LABY8eONdegsDCsXLkSd955J9ra2rBs2TKMHz8ev/vd7wAAjz/+OO666y5s2LABqamp\nGDhwIN544w1TbTCbxERg3TrRVtDchAsXxG093B3ZAgMHTG9k8suwYUBLC42CFLmkPUAZiej16mTC\no3XvbOiDtWvXIj4+HtOmTbPKJtPweDxefSkiOHgQeOgh8e3eJ08Cc+YAZWVi7dA5cwbIyKCZ9iJp\nbaXhrZcvi9s1sjOaRvY0NIjbZEtnzBhgyxYgJUWsHToZGcAHHwATJoi1Y/p04NVXgVtuEWuHVfgb\nO/1u2vr888/x1ltv4Z577sEDDzyAlStX+luE65ClhilbOj5iBC15IXrZi9paskUGEQFuzOIW/cy0\ntZFveuh+FIIs71JVlVzvkmj8btpauHAhPB4PbrvtNly9elXKpeNlY+hQeikvXgSGDBFnh0zNFEDX\ngDlunDg7ZAwK+lySjAxxNtTVAcOHAxER4mzojgxC0tJC2aLo9epkwm8hmTlzZse/BwwYgKlTp5pq\nkIp4PDdeAJEr7csmJMANv4gUEpn9IhJZBVa0X2pqaImfsKDGvKqFT01bixcv7vj3e++9h7fffhtN\nTU3YuXMntmzZYplxKiHDC8AB0xj2izEy+kWGJj/Vhv6agU+aqg+1BYCamhrcdNNNWLp0KTweD6Kj\nozFr1izLDFQFWQLDnXeKtaE7svhFtsCQkAB89ZVYG2T1yzvviLVBtr5GGfBJSMI79ULm5eWhqakJ\n77zzDi5duoTW1lbLjFMJGQKmjDUpWQLmd74j1obuJCQAa9eKtUFWIZHhPWIh6Yrfo7Z27dqF48eP\no6CgAP/wD//gtQ4WY4y+3pZIODAYw34xRla/VFXREGlRyFghE43fQjJgwABMmDAB586dwx/+8Adc\nvHjRCruUQ3RguHKF5kmI3nq4O6L9AsgbMNkv3gwZQlsQNDaKs4GbtrzxW0imTJmCP//5z/jNb36D\nN998k5u2fER0YNAfftFbD3dHtF9k2Xq4O1FRtKnUhQvibJBRSADxzwxnJN74PYAtMzMTr7zyCgDg\n7NmziI6ONt0oFemckosI5rIGhc4B04RdCPymupqWjBG99XB3Og8ZF+GXlhbgm2/kE1jghl8mTxZz\nfs5IvPE7I+lMfn4+srKyzLJFaQYNom1cRS0HIquQdA6YIpC5dilygyt9roQss/07I/J5aWmhpX1k\nFFiRBCUkjH9wwDRGpF9kFViA/dITIv1SW0sZLE9G7AoLiY1wYDBGpF9On6bVmWVE9PPCfvGGm7WM\nYSGxEX4BjBHtFxZYb2T2i8jZ7TJn9iJhIbERDgzGiPYL17y94UzNGJkrZCJhIbER0S8AC4k3p0+z\nX4yQ/XkRNSmRZ7Ubw0JiI6ICw8WLtHnTsGH2n9sXRI5Okjlg6k04IgKmzJlaZCRt+HXmjP3n5qYt\nY1hIbESUkOjBUrbJiDq6X+wOmJcv04x/2Wb76wweDPTrB5w7Z/+5Zc7UAHGVD27aMoaFxEbi42l8\nflubveeVvRY1aBBtnmR3wJR1tn9nRATMK1eApiZ5BRYQXyljusJCYiMREbRbYn29ved1wsMvIjDI\n3KGsI8IvusCGSBwdRPjl2jXeGbEnJH5U1ERUYGAh8Yb9Ygz7xZjqahIRnozoDQuJzYisYcqMKL9w\nRuIN+8UYJ2SwomAhsRmuYRojKjCwX7xhvxjDQtIzLCQ2k5jIQmIE17yNYb8Yw36RCxYSm7H7BdA0\n+UdtAVzz7gnOYI2Ji7N/BCRnJD3DQmIzdgeGxkbaa2PIEPvOGQgiBNYpAbO6mvZssQsnCGxEBE2w\ntXMEJAtJz7CQ2IzdAdMJwRKgwQB2BsyzZykYDR5sz/kCJTKS5tnYNYtbF1gnBEy73yUWkp5hIbGZ\n2FgKCi0t9pzPKULSvz/tBPjNN/aczynBErB3UuL5887IYAF7hUTTWEh6g4XEZsLCaGOcmhp7zucU\nIQHsXR7cSX6xM2CywBrT2EgTNEVse+wEWEgEYHdgkH0OiY6dfnFS7dLu54UF1hsnPS8iYCERgJ0v\nQEUFkJRkz7mChQOmMRwwjWG/yAMLiQASEujBtIOKCmDMGHvOFSx2BwYWEm9YYI1hIekdFhIB2J2R\nsJB447S+ABYSb/h5kQcWEgHY9QK0tAB1dTQXwQlwRmKMnYMQnFTzjo2lUX6trdafy0nPiwhYSARg\nV8CsqqKXLTzc+nOZgV1+aWtzlsDGxQG1tfbM4nZSRhIeTnum2DEC0kkCKwIWEgHYFTCd1KwFUMCs\nr7e+hllbC4wYQbsPOoGICGD4cOtncbe1UVB2yig/wL53iYWkd1hIBBAdDVy6BFy9au15ysudJSTh\n4RTg6+oOHxUQAAAUoElEQVSsPU9FhfOCgh0BUxfYiAhrz2MmdviltdVZGawIWEgEEBJCD6XVk6mc\nlpEA9gSG8nIgOdnac5iNHX4pK3POUHEdO/xSU0OVP6c0EYuAhUQQdrwATppDomOXkLBfvHGqX6yu\nkHGzVt+wkAjCLiHhjMQbJ9a8k5Io0FuJE4UkMZGecyvhEVt9w0IiCLtqmE4TksRE6ydrOrFpKzmZ\nBNBKnCgkdvilrMx5z4vdsJAIwmohaW+nlN9pKXlSEgdMI9gvxuhComnWnYOFpG+kEpJz584hPz8f\n6enpmDt3LhobGw2PS0pKwuTJk5GTk4Pp06fbbKU5WC0ktbU0ZLR/f+vOYQVW1zDb2pw5S9mOgOlE\nIRk2jAavnDtn3TlYSPpGKiF58cUXkZ+fj+PHj2P27Nl48cUXDY/zeDwoKirCvn37UFxcbLOV5mD1\neltObNYCrA+YtbXATTc5T2CjomjeS0ODNeW3tTkzgwWsr3ywkPSNVEKybt06LFmyBACwZMkSfPjh\nhz0eq1lZNbMBvS/AqstwYkc7YH3AdGKtW8fKgFlTQ7PEnTSHRMdKv7S20s6dThRYO5FKSOrr6xET\nEwMAiImJQX0PU3k9Hg/mzJmDqVOn4vXXX7fTRNMYNox2orMqJXeqkADWBgYnjtjSsdIvLLDGVFfT\nHBInCqydhNl9wvz8fNQZTF3+j//4jy5/ezweeDwewzJ27NiB2NhYnDlzBvn5+cjIyMDMmTMNj12x\nYkXHv/Py8pCXlxew7WaTkgKcOkVNLWZTUQFMnmx+uXagBwYrur+cOGJLh4XEmORk4MgRa8p2S7NW\nUVERioqKAv697UKyadOmHr+LiYlBXV0dRo0ahdraWkRHRxseFxsbCwAYOXIk7rvvPhQXF/skJLKh\nC8m0aeaXXV4O3HOP+eXagdUBc8YMa8q2muRk4MABa8p2upB8/LE1ZbtFSLpXsp977jm/fi9V01ZB\nQQFWrVoFAFi1ahUWLFjgdcyVK1dw6dIlAMDly5fxySefYNKkSbbaaRa6kFgBN+EY4/SAyX7xxuqm\nUDcISbBIJSTPPPMMNm3ahPT0dHz22Wd45plnAAA1NTWYP38+AKCurg4zZ85EdnY2cnNzcffdd2Pu\n3LkizQ4Yq4SkrY2atlJSzC/bDjhgGsN9R8YkJdHz3t5uftlO9oud2N601RvDhw/H5s2bvT4fPXo0\n1q9fDwBISUnB/v377TbNElJSgHfeMb/c6mrqdxkwwPyy7SA52TqBdeoQV4ACWmUlXUdoqLllO1lg\nIyOBoUOtWQKfMxLfkCojcRtWZSQnTwJjx5pfrl10DphmUl3tvGXSO9O/P00yNXsjp9ZWKtPJ60ml\npFiTrbGQ+AYLiUASE+kFbmkxt1ynC0n//pRRVVebW67T/QJY07xVUUE7aTpVYAFr/NLcTPOZeB+S\nvmEhEUh4ODB6tPkz3E+dcm7/iI4VNczSUiA11dwy7caKgMkCa0xFBWVpZjcjqggLiWCsaN7iwGAM\nC4kx7BdjuFnLd1hIBJOSQoHfTFQRErMFlgOmMewXY1R4j+yChUQwVmQkp045/wVITaUAZyYnTzo/\nYFpR8Sgtdf7zYkXF48QJIC3N3DJVhYVEMGYLyfnzNArHimVX7CQ9nV5ks9A0NQKm2X4B1BDYxETg\nzBng6lXzymQh8R0WEsGYLSR6Ot7DMmWOIS2NXmSzVkeur6f5BlFR5pQnithY4PJl4MIFc8prb1dj\ncEZoKF2DmVksC4nvsJAIZuxYevjNCpiqtOvedBNtWHTmjDnlqZCNAFRB0EXWDKqraSXqgQPNKU8k\nZvqltZVGUzpdYO2ChUQww4fT/hsGCyIHhCpCApgbGFToUNZJSwOOHzenLBWatXTS083zS3m58+fW\n2AkLiQSMGwccO2ZOWceOUXkqYGZ/gEpCwn4xxkwh4WYt/2AhkYBx48x7Ab7+GsjIMKcs0ZhZ81Yp\nYJrtF1UyWDMFloXEP1hIJMCsjETT1MpIzG7a4oDpzYkTLLBGsJD4BwuJBJglJPX1tOyK04f+6pgV\nMHWBVS1TM2OAxtdfA+PHB1+ODJg5oo2FxD9YSCTALCFRKRsBzBsCXF0NDBpES42rgD6iraEhuHJa\nW2noryoB0+Mxr/LBQuIfLCQSMHYsDTW8fj24clQTkiFDSACCXTb96FF1shHgRsAMthnn1ClaNNSp\n+9YYYYZfrl2jyodT92cRAQuJBPTrR6uMBrv0hUod7TpmZGsqNd/omNEfoOLzYoZfjh+nJVf69TPH\nJjfAQiIJZozcUi0jAYCJE4EjR4Ir4+hR9YRkwgSgpCS4MlT0S0YGCWQwlJSQfxnfYSGRBLNq3qrV\nMCdMMEdIVPOLGQKr4vNihl9YSPyHhUQSMjIo4AVKczO166q2f4JZAVO1mrdZmZpqQpKRQUO9g9l1\n9MgR8i/jOywkkjBpEnDoUOC/P3GCRCQ83DybZEAPmIGO3GpsBJqa1NsuNTmZRm1dvBjY7zVNTYHt\n359WAg5m5BZnJP7DQiIJmZlUQ2xrC+z3Bw8Ckyeba5MMREfTUNf6+sB+r9e6nb4acndCQui6Au0n\nqamhzmRV5hx1ZuJE4PDhwH57/TptkJWebq5NqsNCIgmDB1PQDHTklqpC4vEE14xz4ICafgGC90tW\nlrn2yEJmZuB+OXGCMpr+/c21SXVYSCQimOYtVYUECK7DXeWAyUJiTDAZCTdrBQYLiURMmkSCEAgq\nC0lmZuCBQfWAyULiTTAZycGD9B4y/sFCIhGBZiQNDdShnJhovk0ykJ0N7Nvn/+/a28mfqgbMrCxg\n//7ABiIcPKiuX9LSaKWIK1f8/+3evcCUKebbpDosJBIRqJAcOkTZiGodyjrZ2VTD9HdI58mT1Jms\nyhpb3YmPJxGprvbvd1evUoeyakN/dfr1o+apAwf8/y0LSWCwkEhEejqNpvF3SKfKzVoAbQOblOT/\nCCWVm28AqjjcfDMFP384coSeNZWXALn5ZmDPHv9+U1tLlZWEBGtsUhkWEokID6fA5+8LsHcv1dpV\nJpDAoLqQAFR7Zr94c/PNwFdf+febvXuBnBx1M3srYSGRjOnTgeJi/35TXEy/U5kpU/yveeuBQWUC\nEdgvv6TfqczUqf77Zd8+btYKFBYSycjN9U9ILlwAqqrUX9LBXyHRNGD3bvKnygQiJF98AcyYYY09\nspCZSX1kly/7/hvuHwkcFhLJ8Dcj+eorqnWHhVlnkwzk5FBfUGurb8eXltJeJqNHW2uXaBITqV3f\n1z1bLl+mVaZVbwr1t8Nd0+i9Uz1TswoWEslISaFhi7W1vh3/xRfqN2sBtMlVcrLvw4B371a/1g1Q\ne35uLl2vL+zZQ7X1iAhr7ZKBadPo/fCFigqqpIwda61NqsJCIhkej39Zye7d7hASAJg5E9i2zbdj\n3SIkAHD77cDWrb4d64ZmLR1//LJjB3DbbdzRHigsJBJy223A55/3fVxrKwXWO+6w3iYZ8EdItm8H\nbrnFWntkwZ+AuXUrcOut1tojC7ffTs9Le3vfx27fTu8dExgsJBLy3e8Cn33W93H79tHy6DEx1tsk\nAzNn0gvf10zu+nqa2Tx1qj12iebmm6nf48KF3o9raSEhmTXLHrtEExdHk1F9mX/EQhIcLCQSMm0a\nUF4OnDnT+3FbtpDouIX4eOor6Wvdrc8+oyxN9QEIOv36UfNmX9nal19SH9zIkfbYJQO33953dl9b\nSyMfVR+AYCUsJBISFka176Ki3o/77DP31C517roLWL++92M2bwbmzLHHHln43veADRt6P+bTT4HZ\ns+2xRxby84GNG3s/ZuNGYO5c91Q8rICFRFLmzgU+/rjn7y9dAnbudFdGAgB33927XzQN+OQT9wnJ\nPfcAf/lL781+hYUUWN3EvHnUnNfbfJING6iCwgQOC4mkfP/7FBiuXTP+vrCQOk2jouy1SzR33EGL\nVDY0GH//xRc0f2TcOHvtEk1GBm3GtH+/8ffV1bRbpNsy2KFDqdnvk0+Mv79+nTLYefPstUs1WEgk\nJS6Oxvtv2mT8/bvvAvfdZ69NMtC/P2Vr779v/P277wIPPOC+YZweD3DvvcB77xl//8EHlM2pvFBj\nT9x7L12/EevX07pj0dH22qQaUgnJu+++i4kTJyI0NBR7e1kPo7CwEBkZGUhLS8NLL71ko4X28uCD\nwJ/+5P35mTNUw/qbv7HfJhl49FHgjTe8P792DXjrLeChh+y3SQaWLAFWrfKe/a9pwO9/Dzz8sBi7\nRLNoEWX35897f7dqFfmNCQ6phGTSpElYu3Ytbr/99h6PaWtrw/Lly1FYWIiSkhKsXr0aR48etdFK\n+3j4YRKM06e7fv7668CCBerus9EXc+fSkiDdJ22++y7t6aLqPht9MWkSLYH+0UddP9+xg/YgcVu/\nkc7IkdR01b3yUVpKw37vv1+MXSohlZBkZGQgPT2912OKi4uRmpqKpKQkhIeHY9GiRfio+5ujCFFR\nwLJlwL//+43Pzp0DfvUr4F/+RZxdogkLA376U+BnP7vRudzcDKxYATz1lFDThPPss/SfnpVoGvDM\nM8DTTwMhUr3t9vLMM8DLL3fd6+f554Hly2lIORMcjnu0qqurkdBp55n4+HhU+7tFnIN49lngr38F\n1q6ljsHHHgMWL3ZfZ3J3li6lJr5XXqGZy089RX1Kc+eKtkws8+YBY8YATz5JfvnFL0hkf/AD0ZaJ\nJSsLKCgA/u7vaGLmmjU0D+uf/km0ZWpg+8jp/Px81NXVeX3+wgsv4J577unz9x6X9aIOGUIdhQsW\nUHZyxx1Us3I7/fqRX+bNA154ARg/ntrB3Y7HA7z9Nvll5Ehg1Cga3hoaKtoy8fz619SvGBNDI/vW\nrXPfqEersF1INvU0DMlH4uLiUFlZ2fF3ZWUl4uPjezx+xYoVHf/Oy8tDXl5eUOcXwbRpwKlT1KwV\nGyvaGnlITqZtY2traZSby+oYPTJsGM0xqqmhZfTd3KTVmchImoNUUwOMGOHOEWw9UVRUhKK+ZkD3\ngkfT+lq5yH5mzZqFX/ziF7jZYHOA1tZWjBs3Dp9++ilGjx6N6dOnY/Xq1Rg/frzXsR6PBxJeHsMw\njNT4GzulqqusXbsWCQkJ2L17N+bPn495384Sqqmpwfz58wEAYWFhWLlyJe68805MmDABDz74oKGI\nMAzDMPYgZUZiFpyRMAzD+I+jMxKGYRjGebCQMAzDMEHBQuJgghllITsqXxvA1+d0VL8+f2EhcTAq\nP8wqXxvA1+d0VL8+f2EhYRiGYYKChYRhGIYJCqWH/2ZnZ+PAgQOizWAYhnEUWVlZ2N/TLmkGKC0k\nDMMwjPVw0xbDMAwTFCwkDMMwTFAoKSSqb8WblJSEyZMnIycnB9OnTxdtTtAsXboUMTExmDRpUsdn\n586dQ35+PtLT0zF37lw0NjYKtDA4jK5vxYoViI+PR05ODnJyclBYWCjQwsCprKzErFmzMHHiRGRm\nZuI3v/kNAHXuX0/Xp8r9a25uRm5uLrKzszFhwgT8y7c75vl9/zTFaG1t1caOHauVlZVp169f17Ky\nsrSSkhLRZplKUlKSdvbsWdFmmMbWrVu1vXv3apmZmR2fPfXUU9pLL72kaZqmvfjii9rTTz8tyryg\nMbq+FStWaL/85S8FWmUOtbW12r59+zRN07RLly5p6enpWklJiTL3r6frU+X+aZqmXb58WdM0TWtp\nadFyc3O1bdu2+X3/lMtI3LIVr6bQGImZM2di2LBhXT5bt24dlixZAgBYsmQJPvzwQxGmmYLR9QFq\n3MNRo0YhOzsbADBo0CCMHz8e1dXVyty/nq4PUOP+AUBkZCQA4Pr162hra8OwYcP8vn/KCYkbtuL1\neDyYM2cOpk6ditdff120OZZQX1+PmJgYAEBMTAzq6+sFW2Q+//Vf/4WsrCwsW7bMsU0/nSkvL8e+\nffuQm5ur5P3Tr2/GjBkA1Ll/7e3tyM7ORkxMTEcznr/3TzkhccNWvDt27MC+ffuwceNG/Pd//ze2\nbdsm2iRL8Xg8yt3XJ554AmVlZdi/fz9iY2Px5JNPijYpKJqamrBw4UK8+uqrGDx4cJfvVLh/TU1N\nuP/++/Hqq69i0KBBSt2/kJAQ7N+/H1VVVdi6dSu2bNnS5Xtf7p9yQuLvVrxOJPbb/XZHjhyJ++67\nD8XFxYItMp+YmBjU1dUBAGpraxEdHS3YInOJjo7ueEEfe+wxR9/DlpYWLFy4EI888ggWLFgAQK37\np1/fww8/3HF9Kt0/naioKMyfPx979uzx+/4pJyRTp07FiRMnUF5ejuvXr2PNmjUoKCgQbZZpXLly\nBZcuXQIAXL58GZ988kmX0UCqUFBQgFWrVgEAVq1a1fECq0JtbW3Hv9euXevYe6hpGpYtW4YJEybg\nH//xHzs+V+X+9XR9qty/hoaGjma5q1evYtOmTcjJyfH//lk5GkAUGzZs0NLT07WxY8dqL7zwgmhz\nTOXUqVNaVlaWlpWVpU2cOFGJ61u0aJEWGxurhYeHa/Hx8dof/vAH7ezZs9rs2bO1tLQ0LT8/Xzt/\n/rxoMwOm+/X93//9n/bII49okyZN0iZPnqzde++9Wl1dnWgzA2Lbtm2ax+PRsrKytOzsbC07O1vb\nuHGjMvfP6Po2bNigzP07ePCglpOTo2VlZWmTJk3SXn75ZU3TNL/vHy+RwjAMwwSFck1bDMMwjL2w\nkDAMwzBBwULCMAzDBAULCcMwDBMULCQMwzBMULCQMAzDMEHBQsIwDMMEBQsJwzAMExQsJAzDMExQ\nhIk2gGHcQltbG9asWYNTp04hISEBxcXFePLJJ5GSkiLaNIYJCs5IGMYmDhw4gIULFyIlJQXt7e14\n4IEHOlZyZhgnw0LCMDYxZcoUREREYNeuXcjLy0NeXh4GDBgg2iyGCRoWEoaxiS+//BINDQ04fPgw\nkpOTld+QjHEP3EfCMDZRWFiImJgY3HrrrVi7di1GjBgh2iSGMQVeRp5hGIYJCm7aYhiGYYKChYRh\nGIYJChYShmEYJihYSBiGYZigYCFhGIZhgoKFhGEYhgkKFhKGYRgmKFhIGIZhmKD4fxexm1rPcz0/\nAAAAAElFTkSuQmCC\n",
"text": [
"<matplotlib.figure.Figure at 0x2aa63d0>"
]
}
],
"prompt_number": 218
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"Visualization with Python\n",
"-------------------------\n",
"\n",
"* 2-D (such as images)"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"image = np.random.rand(30, 30)\n",
"pl.imshow(image)\n",
"pl.gray()\n",
"pl.show()"
],
"language": "python",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"outputs": [
{
"metadata": {},
"output_type": "display_data",
"png": "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\n64t33323WFlZKQ4dOlS88847m33ZDdt1111XzMzM9HUMb7zxRvHnP/+5uP322+tQ+10AAAMrSURB\nVNPfvvOd7xTPPfdcURRF8cMf/rB4+umn+z6mZ555pnj++ee3dBzeTp06VZw4caIoiqJoNpvFTTfd\nVLzzzjt9n6uqcfV7vnq1Tbfwb731lm644QZdd911Ghwc1EMPPaTf/va3m33Zy2pFnxMUn/3sZzU9\nPV362+9+9zs9+uijkqRHH31Uv/nNb/o+Jqm/c3XNNdfo8OHDki5tyLrlllv0/vvv932uqsYl9V+2\nqtqmA/7999/Xxz72sfT5wIEDaVL62Wq1mr7whS/ozjvv1M9+9rN+Dye106dPa9++fZKkffv26fTp\n030e0aX24osv6tChQzp69OiWu87e3nvvPZ04cUKf+cxnrqi5Ylx33XWXpCtnvmLbdMBfqRVlx48f\n14kTJ/Taa6/pJz/5id58881+D6mrXe6xRZvdHn/8cb377rt6++23tX//fj311FN9GUer1dIDDzyg\nF154obQTU+rvXLVaLT344IN64YUXND4+fsXMV65tOuA/+tGP6uTJk+nzyZMndeDAgc2+7IZt//79\nkqQ9e/boa1/7mt56660+j+hS27dvnz744ANJ0qlTp7R3794+j0jau3dvAtRjjz3Wl7lqt9t64IEH\n9Mgjj+j++++XdGXMFeN6+OGH07iuhPmqapsO+DvvvFP//Oc/9d5772llZUW//vWvdd999232ZXs2\ntldK0oULF/T73/++xEr3s9133306duyYJOnYsWNJiPrZTp06ld6/8sorWz5XRVHo6NGjuvXWW/XE\nE0+kv/d7rqrG1e/56tm2ghl89dVXi5tuuqm4/vrri2effXYrLtmz/fvf/y4OHTpUHDp0qLjtttv6\nNqaHHnqo2L9/fzE4OFgcOHCg+MUvflHMzMwUn//854sbb7yxuPfee4u5ubm+jumll14qHnnkkeKO\nO+4oDh48WHz1q18tPvjggy0d05tvvlnUarXi0KFDxeHDh4vDhw8Xr732Wt/nKjeuV199te/z1att\n19Jvt+12FbXtSrvttt2uorYN+O223a6itg347bbdrqK2Dfjttt2uorYN+O223a6itg347bbdrqK2\nDfjttt2uovb/AOiQVNc3taFMAAAAAElFTkSuQmCC\n",
"text": [
"<matplotlib.figure.Figure at 0x44f6510>"
]
}
],
"prompt_number": 219
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"Visualization with Python\n",
"-------------------------\n",
"\n",
"* [**Mayavi**](http://mayavi.sourceforge.net) : 3-D visualization\n",
"\n",
"<img src=\"http://docs.enthought.com/mayavi/mayavi/_images/example_surface_from_irregular_data.jpg\" width=240>\n",
"\n",
"* [**PySurfer**](http://pysurfer.github.com) uses Mayavi to visualize cortical surfaces\n",
"\n",
"\n",
"<div style=\"float: left\">\n",
"<img src=\"http://pysurfer.github.io/_images/plot_fmri_contours.png\" width=200>\n",
"<img src=\"http://pysurfer.github.io/_images/plot_labels.png\" width=200>\n",
"<img src=\"http://pysurfer.github.io/_images/plot_meg_inverse_solution.png\" width=415>\n",
"</div>\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"Learn more\n",
"----------\n",
"\n",
"- http://scipy-lectures.github.com\n",
"- http://www.scipy.org/NumPy_for_Matlab_Users\n",
"\n",
"Even more:\n",
"\n",
"- Matlab like IDE environment: http://packages.python.org/spyder\n",
"- Parallel computing: http://packages.python.org/joblib\n",
"- Cython: write Python get C code http://cython.org"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"Python for brain imaging\n",
"------------------------\n",
"\n",
"- [**NiBabel**](http://nipy.sourceforge.net/nibabel) for handling neurimaging file formats\n",
"- [**Nipype**](http://nipy.sourceforge.net/nipype) Pipeline for SPM, FSL, FreeSurfer, etc.\n",
"- [**PySurfer**](http://pysurfer.github.com) visualization of FreeSurfer surfaces\n",
"- [**MNE-Python**](http://martinos.org/mne) MEG and EEG data analysis\n",
"- [**scikit-learn**](http://scikit-learn.org) Machine learning and statistics\n",
"- [**NiLearn**](http://nilearn.github.io) Machine learning for neuroimaging (uses scikit-learn)\n",
"- [**NIPY**](http://www.nipy.org) various neuroimaging packages\n",
"- etc.\n",
"\n",
"A really active community !"
]
}
],
"metadata": {}
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment