This shows you the differences between two versions of the page.
python_getting_started [2013/08/14 11:34] asa |
python_getting_started [2016/08/09 10:25] |
||
---|---|---|---|
Line 1: | Line 1: | ||
- | ===== A bit of Python ===== | ||
- | |||
- | Python is available on any Linux/Unix machine including department machines and Macs. | ||
- | |||
- | You can download and install python on your own computer by following | ||
- | instructions at [[http://www.python.org]] | ||
- | |||
- | You can use the Python interpreter interactively by typing //python// at a terminal window. | ||
- | Ipython is a nicer front end to python that is invoked with | ||
- | ipython | ||
- | To quit, type control-d | ||
- | |||
- | To run python code in a file //code.py//, either type | ||
- | run code.py | ||
- | in //ipython//, or type | ||
- | python code.py | ||
- | at the unix command line. | ||
- | |||
- | When in //ipython//, you may type python statements or expressions | ||
- | that are evaluated, or //ipython// commands. See the | ||
- | [[http://showmedo.com/videotutorials/video?name=1000010&fromSeriesID=100|Video | ||
- | tutorial on using ipython]], in five parts by Jeff Rush, for help | ||
- | getting started with //ipython//. | ||
- | |||
- | Documentation is immediately available for many things. For example: | ||
- | <code> | ||
- | > ipython | ||
- | asa:~$ ipython | ||
- | Python 2.7.3 (v2.7.3:70274d53c1dd, Apr 9 2012, 20:52:43) | ||
- | Type "copyright", "credits" or "license" for more information. | ||
- | |||
- | IPython 0.13.2 -- An enhanced Interactive Python. | ||
- | ? -> Introduction and overview of IPython's features. | ||
- | %quickref -> Quick reference. | ||
- | help -> Python's own help system. | ||
- | object? -> Details about 'object', use 'object??' for extra details. | ||
- | |||
- | In [1]: list? | ||
- | Type: type | ||
- | Base Class: <type 'type'> | ||
- | String Form: <type 'list'> | ||
- | Namespace: Python builtin | ||
- | Docstring: | ||
- | list() -> new list | ||
- | list(sequence) -> new list initialized from sequence's items | ||
- | |||
- | In [2]: help(list) | ||
- | Help on class list in module __builtin__: | ||
- | |||
- | class list(object) | ||
- | | list() -> new list | ||
- | | list(sequence) -> new list initialized from sequence's items | ||
- | | | ||
- | | Methods defined here: | ||
- | . | ||
- | . | ||
- | . | ||
- | | append(...) | ||
- | | L.append(object) -- append object to end | ||
- | | | ||
- | . | ||
- | . | ||
- | . | ||
- | | | ||
- | | sort(...) | ||
- | | L.sort(cmp=None, key=None, reverse=False) -- stable sort *IN PLACE*; | ||
- | | cmp(x, y) -> -1, 0, 1 | ||
- | </code> | ||
- | |||
- | What is the value of $(100\cdot 2 - 12^2) / 7 \cdot 5 + 2\;\;\;$? | ||
- | <code python> | ||
- | In [301]: (100*2 - 12**2) / 7*5 + 2 | ||
- | Out[301]: 42 | ||
- | </code> | ||
- | |||
- | In order to compute something like $\sin(\pi/2)$ we first need to //import// the //math// module: | ||
- | <code python> | ||
- | In [303]: import math | ||
- | In [304]: math.sin(math.pi/2) | ||
- | 1.0 | ||
- | </code> | ||
- | |||
- | How do I find out what other mathematical functions are available? | ||
- | help("math") | ||
- | |||
- | |||
- | |||
- | ===== Plotting ===== | ||
- | |||
- | Let's get on to that all important step of visualizing data. We will be using the [[http://matplotlib.org |matplotlib]] Python package for that. Let's start by plotting the function $f(x) = x^2$. | ||
- | |||
- | First, let's generate the numbers. Well, there are tons of ways to do so. First, using a''for'' loop. | ||
- | <code python> | ||
- | In [3]: f = [] | ||
- | |||
- | In [4]: for i in range(10) : | ||
- | ...: f.append(i**2) | ||
- | ...: | ||
- | |||
- | In [5]: f | ||
- | Out[5]: [0, 1, 4, 9, 16, 25, 36, 49, 64, 81] | ||
- | </code> | ||
- | |||
- | To plot the data, first import the ''pyplot'' module. | ||
- | |||
- | <code python> | ||
- | In [6]: import matplotlib.pyplot as plt | ||
- | |||
- | In [7]: plt.plot(range(10), f) | ||
- | Out[7]: [<matplotlib.lines.Line2D at 0x10549b590>] | ||
- | |||
- | </code> | ||
- | In order to actually see the plot you need to do: | ||
- | |||
- | <code python> | ||
- | In [8]: plt.show() | ||
- | </code> | ||
- | As an alternative, you can put matplotlib in interactive mode before plotting using the command ''plt.ion()''. | ||
- | |||
- | Python has some nifty syntax for generating lists. Watch this! A [[http://www.secnetix.de/olli/Python/list_comprehensions.hawk|list comprehension]]!! | ||
- | |||
- | <code python> | ||
- | In [9]: f = [i**2 for i in range(10)] | ||
- | |||
- | In [10]: f | ||
- | Out[10]: [0, 1, 4, 9, 16, 25, 36, 49, 64, 81] | ||
- | </code> | ||
- | |||
- | There's an alternative way of doing this using ''numpy'': | ||
- | |||
- | <code python> | ||
- | |||
- | In [11]: import numpy as np | ||
- | |||
- | In [12]: f = np.arange(10)**2 | ||
- | |||
- | In [13]: f | ||
- | Out[13]: array([ 0, 1, 4, 9, 16, 25, 36, 49, 64, 81]) | ||
- | </code> | ||
- | |||
- | Note that plotting functions to accept either lists or ''numpy'' arrays, so a fast way of doing our plot is | ||
- | <code python> | ||
- | In [14]: plt.plot(np.arange(10), np.arange(10)**2) | ||
- | </code> | ||
- | |||
- | For a smoother plot: | ||
- | <code python> | ||
- | In [14]: x = np.arange(10, 0.1) | ||
- | |||
- | In [15]: plt.plot(x, x**2, 'ob') | ||
- | Out[15]: [<matplotlib.lines.Line2D at 0x1054162d0>] | ||
- | </code> | ||
- | /* {{ Notes:plot2.png?400 }}*/ | ||
- | |||
- | |||
- | We can add a second plot to the same axes by calling //plot// again: | ||
- | <code python> | ||
- | In [16]: plt.plot(x, x, 'dr') | ||
- | Out[16]: [<matplotlib.lines.Line2D object at 0x3608990>] | ||
- | </code> | ||
- | |||
- | /*{{ Notes:plot3.png?400 }}*/ | ||
- | |||
- | |||
- | ===== Matrices in Python ===== | ||
- | |||
- | Can I work with vectors and matrices in python? | ||
- | |||
- | Of course! No data analysis tool is worth the bytes it burns if it | ||
- | doesn't. The ''numpy'' package provides the required magic. | ||
- | Let's create an array that represents the following matrix: | ||
- | \[\left ( \begin{array}{cc} | ||
- | 1 & 2\\ | ||
- | 3 & 4\\ | ||
- | 5 & 6 | ||
- | \end{array} \right ) \] | ||
- | by doing | ||
- | <code> | ||
- | In [17]: import numpy as np | ||
- | |||
- | In [18]: m = np.array([[1,2], [3,4], [5,6]]) | ||
- | |||
- | In [19]: m | ||
- | Out[19]: | ||
- | array([[1, 2], | ||
- | [3, 4], | ||
- | [5, 6]]) | ||
- | </code> | ||
- | |||
- | Let's construct the matrices | ||
- | \[a = \left ( \begin{array}{cc} | ||
- | 2 & 2 & 2\\ | ||
- | 2 & 2 & 2\\ | ||
- | 2 & 2 & 2 | ||
- | \end{array} \right ) \] | ||
- | and | ||
- | \[b = \left ( \begin{array}{cc} | ||
- | 1 & 2 & 3\\ | ||
- | 4 & 5 & 6\\ | ||
- | 7 & 8 & 9 | ||
- | \end{array} \right ) \] | ||
- | <code python> | ||
- | In [16]: a = np.ones((3,3)) * 2 | ||
- | |||
- | In [17]: a | ||
- | Out[17]: | ||
- | array([[ 2., 2., 2.], | ||
- | [ 2., 2., 2.], | ||
- | [ 2., 2., 2.]]) | ||
- | |||
- | In [18]: b = np.resize(np.arange(9)+1,(3,3)) | ||
- | |||
- | In [19]: b | ||
- | Out[19]: | ||
- | array([[1, 2, 3], | ||
- | [4, 5, 6], | ||
- | [7, 8, 9]]) | ||
- | </code> | ||
- | |||
- | What is the value of $a * b$? | ||
- | <code python> | ||
- | In [20]: a * b | ||
- | Out[21]: | ||
- | array([[ 2, 4, 6], | ||
- | [ 8, 10, 12], | ||
- | [14, 16, 18]]) | ||
- | </code> | ||
- | The ''*'' operator does a component-wise multiplication. Use the | ||
- | ''numpy'' function ''dot'' to do matrix multiplication. | ||
- | |||
- | <code python> | ||
- | In [22]: np.dot(a,b) | ||
- | Out[22]: | ||
- | array([[24, 30, 36], | ||
- | [24, 30, 36], | ||
- | [24, 30, 36]]) | ||
- | </code> | ||
- | |||
- | An array is transposed by | ||
- | <code python> | ||
- | In [23]: b.transpose() | ||
- | Out[23]: | ||
- | array([[1, 4, 7], | ||
- | [2, 5, 8], | ||
- | [3, 6, 9]]) | ||
- | |||
- | In [24]: b.T | ||
- | Out[24]: | ||
- | array([[1, 4, 7], | ||
- | [2, 5, 8], | ||
- | [3, 6, 9]]) | ||
- | </code> | ||
- | |||
- | Elements and sub-matrices are easily extracted: | ||
- | <code> | ||
- | In [25]: b | ||
- | Out[25]: | ||
- | array([[1, 2, 3], | ||
- | [4, 5, 6], | ||
- | [7, 8, 9]]) | ||
- | |||
- | In [26]: b[0,0] | ||
- | Out[26]: 1 | ||
- | |||
- | In [27]: b[0,1] | ||
- | Out[27]: 2 | ||
- | |||
- | In [28]: b[0:2, 1:3] | ||
- | Out[28]: | ||
- | array([[2, 3], | ||
- | [5, 6]]) | ||
- | </code> | ||
- | |||
- | Let's multiply the first row of a $a$ by the second column of $b$. | ||
- | <code> | ||
- | In [29]: np.dot(a[0], b[:,1]) | ||
- | Out[29]: 30.0 | ||
- | |||
- | In [30]: np.dot(a[0],b.T[1]) | ||
- | Out[30]: 30.0 | ||
- | </code> | ||
- | |||
- | How do I find the inverse of a matrix? | ||
- | <code python> | ||
- | In [2]: z = np.array([[2,1,1],[1,2,2],[2,3,4]]) | ||
- | |||
- | In [3]: z | ||
- | Out[3]: | ||
- | array([[2, 1, 1], | ||
- | [1, 2, 2], | ||
- | [2, 3, 4]]) | ||
- | |||
- | In [4]: np.linalg.inv(z) | ||
- | Out[4]: | ||
- | array([[ 0.66666667, -0.33333333, 0. ], | ||
- | [ 0. , 2. , -1. ], | ||
- | [-0.33333333, -1.33333333, 1. ]]) | ||
- | |||
- | In [5]: np.dot(z, np.linalg.inv(z)) | ||
- | Out[5]: | ||
- | array([[ 1., 0., 0.], | ||
- | [ 0., 1., 0.], | ||
- | [ 0., 0., 1.]]) | ||
- | </code> |