{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Statistical Methods in Cosmology and Astrophysics: Python tutorial"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "What is python?\n",
    "* python is an interpreted language, which makes it easy to learn and use\n",
    "* python heavily relies on modules (libraries) which already contain a vast number of ready-to-use functions; once these modules are installed they are ready to use!"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Important python modules:\n",
    "* `NumPy`: combines functionality to work with arrays (see: http://www.numpy.org)\n",
    "* `SciPy`: module containing a lot of general scientific routines, methods, functions, distributions (see: http://www.scipy.org/scipylib/index.html)\n",
    "* `matplotlib`: contains all routines for plotting (see http://matplotlib.org)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "There are different ways to work with python. We can use scripts and run those from the command line (we'll do that later today) or we can also work interactively with python. There are two main ways to work interactively with python:\n",
    "* through the ipython shell <img src=\"figs/ipython-shell.png\">\n",
    "* through the ipython notebook <img src=\"figs/ipython-notebook.png\">"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##Importing modules"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import scipy\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Defining variables "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Define an integer object"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "8\n",
      "<type 'int'>\n"
     ]
    }
   ],
   "source": [
    "myvar = 8\n",
    "print(myvar)\n",
    "print(type(myvar))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Define a float object"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "8.0\n",
      "<type 'float'>\n"
     ]
    }
   ],
   "source": [
    "myvar = 8.\n",
    "print(myvar)\n",
    "print(type(myvar))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Define a string object"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "hello\n",
      "<type 'str'>\n"
     ]
    }
   ],
   "source": [
    "myvar = 'hello'\n",
    "print(myvar)\n",
    "print(type(myvar))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Integer division"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0\n"
     ]
    }
   ],
   "source": [
    "myvar1 = 8\n",
    "myvar2 = 10\n",
    "div = myvar1/myvar2\n",
    "print(div)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Float division"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.8\n"
     ]
    }
   ],
   "source": [
    "myvar1 = 8.\n",
    "myvar2 = 10.\n",
    "div = myvar1/myvar2\n",
    "print(div)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Numpy arrays"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Numpy arrays have three basic properties:\n",
    "* `shape`: the size of the array\n",
    "* `ndim`: the dimension of the array \n",
    "* `dtype`: the type of the array"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Initialisation of numpy arrays"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Create an array filled with zeros:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[ 0.  0.  0.]\n",
      " [ 0.  0.  0.]]\n"
     ]
    }
   ],
   "source": [
    "zeroarr = np.zeros((2,3))\n",
    "print(zeroarr)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Let's see the properties of our array:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(2, 3)\n",
      "2\n",
      "float64\n",
      "<type 'numpy.ndarray'>\n"
     ]
    }
   ],
   "source": [
    "print(zeroarr.shape)\n",
    "print(zeroarr.ndim)\n",
    "print(zeroarr.dtype)\n",
    "print(type(zeroarr))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "So our array has 2 axis (dimensions). These are labelled as follows: <img src=\"figs/numpy-axis.png\">"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Create an array filled with ones"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[ 1.  1.  1.]\n",
      " [ 1.  1.  1.]]\n"
     ]
    }
   ],
   "source": [
    "onearr = np.ones((2,3))\n",
    "print(onearr)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Initialise an array by hand:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[0 1 2]\n",
      " [3 4 5]]\n"
     ]
    }
   ],
   "source": [
    "myarr = np.array([[0,1,2],[3,4,5]])\n",
    "print(myarr)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Initialise the same array but using numpy"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[0 1 2]\n",
      " [3 4 5]]\n"
     ]
    }
   ],
   "source": [
    "myarr = np.arange(6).reshape((2,3))\n",
    "print(myarr)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Change the type of an array"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[ 0.  1.  2.]\n",
      " [ 3.  4.  5.]]\n"
     ]
    }
   ],
   "source": [
    "myarr = myarr.astype('float')\n",
    "print(myarr)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Create an array consisting of samples drawn from a standard normal distribution with mean $\\mu$ and variance $\\sigma$: (`numpy.random.randn` returns samples from a Gaussian with $\\mu = 0$ and $\\sigma=1$)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "n = 10**6\n",
    "mu = 3.\n",
    "sigma = 0.1\n",
    "randarr = mu + sigma*np.random.randn(n)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Accessing array elements"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Access elements of the array; numpy arrays start with 0!"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "5.0\n"
     ]
    }
   ],
   "source": [
    "print(myarr[1,2])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Access rows of the array"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[ 3.  4.  5.]\n"
     ]
    }
   ],
   "source": [
    "print(myarr[1,:])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Access columns of the array"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[ 1.  4.]\n"
     ]
    }
   ],
   "source": [
    "print(myarr[:,1])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Operations on numpy arrays"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Addition of arrays"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "First array\n",
      "[0 1 2 3 4 5 6 7 8 9]\n",
      "Second array\n",
      "[10 11 12 13 14 15 16 17 18 19]\n",
      "Sum of first and second array\n",
      "[10 12 14 16 18 20 22 24 26 28]\n"
     ]
    }
   ],
   "source": [
    "arr1 = np.arange(10)\n",
    "arr2 = np.arange(10, 20)\n",
    "print('First array')\n",
    "print(arr1)\n",
    "print('Second array')\n",
    "print(arr2)\n",
    "print('Sum of first and second array')\n",
    "print(arr1+arr2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "First array\n",
      "[[0 1 2 3 4]\n",
      " [5 6 7 8 9]]\n",
      "Second array\n",
      "[[10 11 12 13 14]\n",
      " [15 16 17 18 19]]\n",
      "Sum of first and second array\n",
      "[[10 12 14 16 18]\n",
      " [20 22 24 26 28]]\n"
     ]
    }
   ],
   "source": [
    "arr1 = np.arange(10).reshape((2,5))\n",
    "arr2 = np.arange(10, 20).reshape((2,5))\n",
    "print('First array')\n",
    "print(arr1)\n",
    "print('Second array')\n",
    "print(arr2)\n",
    "print('Sum of first and second array')\n",
    "print(arr1+arr2)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "In numpy most mathematical functions can be applied to arrays"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Compute the square root of an array"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[ 1  4  9 16 25]\n",
      "[ 1.  2.  3.  4.  5.]\n"
     ]
    }
   ],
   "source": [
    "arr = np.arange(1, 6)**2\n",
    "print(arr)\n",
    "print(np.sqrt(arr))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Compute the natural logarithm of an array"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[ 0.          1.38629436  2.19722458  2.77258872  3.21887582]\n"
     ]
    }
   ],
   "source": [
    "print(np.log(arr))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Creating new arrays from an array: sum array elements"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Array\n",
      "[[0 1 2 3 4]\n",
      " [5 6 7 8 9]]\n",
      "Sum the rows of the array\n",
      "[10 35]\n"
     ]
    }
   ],
   "source": [
    "arr1 = np.arange(10).reshape((2,5))\n",
    "print('Array')\n",
    "print(arr1)\n",
    "print('Sum the rows of the array')\n",
    "print(np.sum(arr1, axis=1))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Array\n",
      "[[0 1 2 3 4]\n",
      " [5 6 7 8 9]]\n",
      "Sum the columns of the array\n",
      "[ 5  7  9 11 13]\n"
     ]
    }
   ],
   "source": [
    "arr1 = np.arange(10).reshape((2,5))\n",
    "print('Array')\n",
    "print(arr1)\n",
    "print('Sum the columns of the array')\n",
    "print(np.sum(arr1, axis=0))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Array multiplication"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "First array\n",
      "[1 2 3 4]\n",
      "Second array\n",
      "[2 3 4 5]\n",
      "Multiplication of both arrays\n",
      "[ 2  6 12 20]\n"
     ]
    }
   ],
   "source": [
    "arr1 = np.arange(1, 5)\n",
    "arr2 = np.arange(2, 6)\n",
    "print('First array')\n",
    "print(arr1)\n",
    "print('Second array')\n",
    "print(arr2)\n",
    "print('Multiplication of both arrays')\n",
    "print(arr1*arr2)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Multiplication of two 2 dimensional arrays is still elementwise, it is not matrix multiplication."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "First array\n",
      "[[1 2]\n",
      " [3 4]]\n",
      "Second array\n",
      "[[2 3]\n",
      " [4 5]]\n",
      "Multiplication of both arrays\n",
      "[[ 2  6]\n",
      " [12 20]]\n"
     ]
    }
   ],
   "source": [
    "arr1 = np.arange(1, 5).reshape((2,2))\n",
    "arr2 = np.arange(2, 6).reshape((2,2))\n",
    "print('First array')\n",
    "print(arr1)\n",
    "print('Second array')\n",
    "print(arr2)\n",
    "print('Multiplication of both arrays')\n",
    "print(arr1*arr2)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "In order to perform a matrix multiplication on two arrays we need to use `np.dot`:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "First array\n",
      "[[1 2]\n",
      " [3 4]]\n",
      "Second array\n",
      "[[2 3]\n",
      " [4 5]]\n",
      "Matrix multiplication of both arrays\n",
      "[[10 13]\n",
      " [22 29]]\n"
     ]
    }
   ],
   "source": [
    "arr1 = np.arange(1, 5).reshape((2,2))\n",
    "arr2 = np.arange(2, 6).reshape((2,2))\n",
    "print('First array')\n",
    "print(arr1)\n",
    "print('Second array')\n",
    "print(arr2)\n",
    "print('Matrix multiplication of both arrays')\n",
    "print(np.dot(arr1,arr2))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "One thing to keep in mind with python objects: object assignment creates a reference to the same object:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "First array\n",
      "[1 2 3 4]\n",
      "Second array\n",
      "[1 2 3 4]\n",
      "First array\n",
      "[   1 1000    3    4]\n",
      "Second array\n",
      "[   1 1000    3    4]\n"
     ]
    }
   ],
   "source": [
    "arr1 = np.arange(1, 5)\n",
    "arr2 = arr1\n",
    "print('First array')\n",
    "print(arr1)\n",
    "print('Second array')\n",
    "print(arr2)\n",
    "arr1[1] = 1000\n",
    "print('First array')\n",
    "print(arr1)\n",
    "print('Second array')\n",
    "print(arr2)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "In order to force python to create a new object we need to copy the array:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "First array\n",
      "[1 2 3 4]\n",
      "Second array\n",
      "[1 2 3 4]\n",
      "First array\n",
      "[   1 1000    3    4]\n",
      "Second array\n",
      "[1 2 3 4]\n"
     ]
    }
   ],
   "source": [
    "arr1 = np.arange(1, 5)\n",
    "arr2 = np.copy(arr1)\n",
    "print('First array')\n",
    "print(arr1)\n",
    "print('Second array')\n",
    "print(arr2)\n",
    "arr1[1] = 1000\n",
    "print('First array')\n",
    "print(arr1)\n",
    "print('Second array')\n",
    "print(arr2)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Python lists"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Lists in python are defined by square brackets and can mix different types (unlike numpy arrays):"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[2, '4', 'adsf', 4.0, [3.0, -7]]\n"
     ]
    }
   ],
   "source": [
    "mylist = [2,'4','adsf',4.,[3.,-7]]\n",
    "print(mylist)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can access list elements as arrays elements:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "2\n",
      "[3.0, -7]\n"
     ]
    }
   ],
   "source": [
    "print(mylist[0])\n",
    "print(mylist[-1])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "-7\n"
     ]
    }
   ],
   "source": [
    "print(mylist[-1][1])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can also add two lists:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "First list\n",
      "[2, '4', 'adsf', 4.0, [3.0, -7]]\n",
      "Second list\n",
      "['d', True, False, None, 'bka', 2.0]\n",
      "Sum of two lists\n",
      "[2, '4', 'adsf', 4.0, [3.0, -7], 'd', True, False, None, 'bka', 2.0]\n"
     ]
    }
   ],
   "source": [
    "list1 = [2,'4','adsf',4.,[3.,-7]]\n",
    "list2 = ['d',True,False,None,'bka',2.]\n",
    "print('First list')\n",
    "print(list1)\n",
    "print('Second list')\n",
    "print(list2)\n",
    "print('Sum of two lists')\n",
    "print(list1+list2)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Functions in python"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Let's define a function which computes the sum of two variables:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def sum_two(a, b):\n",
    "    \"\"\"\n",
    "    Computes the sum of two numbers\n",
    "    :param a: first number to sum\n",
    "    :param b: second number to sum\n",
    "    :return c: sum of a and b\n",
    "    \"\"\"\n",
    "    c = a + b\n",
    "    return c"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Let's call our function"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "18"
      ]
     },
     "execution_count": 33,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a = 3\n",
    "b = 15\n",
    "sum_two(3, 15)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now let's sum two or three numbers:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def sum_three(a, b, c=0):\n",
    "    \"\"\"\n",
    "    Computes the sum of two or three numbers\n",
    "    :param a: first number to sum\n",
    "    :param b: second number to sum\n",
    "    :param c: third number to sum, default c=0\n",
    "    :return c: sum of a and b\n",
    "    \"\"\"\n",
    "    d = a + b + c\n",
    "    return d"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "18"
      ]
     },
     "execution_count": 35,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a = 3\n",
    "b = 15\n",
    "sum_three(3, 15)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "23"
      ]
     },
     "execution_count": 36,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a = 3\n",
    "b = 15\n",
    "c = 5\n",
    "sum_three(3, 15, 5)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "###For loops"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "i\n",
      "0\n",
      "Sum of three numbers\n",
      "3\n",
      "i\n",
      "1\n",
      "Sum of three numbers\n",
      "6\n",
      "i\n",
      "2\n",
      "Sum of three numbers\n",
      "9\n",
      "i\n",
      "3\n",
      "Sum of three numbers\n",
      "12\n",
      "i\n",
      "4\n",
      "Sum of three numbers\n",
      "15\n"
     ]
    }
   ],
   "source": [
    " for i in range(5):\n",
    "        print('i')\n",
    "        print(i)\n",
    "        print('Sum of three numbers')\n",
    "        print(sum_three(i, i+1, i+2))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Plotting in python"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Let's plot a sin curve:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "x = np.linspace(0, 2.*np.pi, 1000)\n",
    "y = np.sin(x)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\nm20C7QAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x105fc7f50>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig = plt.figure()\n",
    "ax = fig.add_subplot(111)\n",
    "ax.plot(x, y, color=\"#4682b4\", label=r'$\\sin{\\theta}$')    \n",
    "ax.set_xlabel(r\"$\\theta$\", fontsize=16)\n",
    "ax.set_ylabel(r\"$\\sin{\\theta}$\", fontsize=16)\n",
    "leg = ax.legend(loc='upper right',prop={'size':16})\n",
    "leg.draw_frame(False) \n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Let's check if we really sampled the normal distribution when we looked at arrays:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\ngg==\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x105fc7d10>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig = plt.figure()\n",
    "ax = fig.add_subplot(111)\n",
    "ax.hist(randarr, color=\"#4682b4\", histtype='step', bins=100, normed='True')    \n",
    "ax.set_xlabel(r\"$x$\", fontsize=16)\n",
    "ax.set_ylabel(r\"$p(x)$\", fontsize=16)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 2",
   "language": "python",
   "name": "python2"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.10"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 0
}
