{ "metadata": { "name": "", "signature": "sha256:537b3c76082e31c6b32146ef2c2ff4454c9be8e4d566445c3f70d14ecdacc6a9" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ { "cell_type": "heading", "level": 1, "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "Basic NumPy Refresher" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "-" } }, "source": [ "May, 2014\n", "\n", "Chang Y. Chung" ] }, { "cell_type": "heading", "level": 2, "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "Introduction" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "-" } }, "source": [ "* NumPy, Numerical Python, is the package for scientific computing and data analysis, implementing the multidimensional array object, `ndarray`." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "* Elements of an `ndarray` are homogeneous (all of the same `dtype`) and are indexed by a tuple of positive integers." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "* Dimensions are called `axes`. The number of axes is `rank`." ] }, { "cell_type": "code", "collapsed": false, "input": [ "import numpy as np\n", "\n", "a = np.array([[0, 1, 2], [3, 4, 5]]) # a 2D, 2 x 3, array\n", "a" ], "language": "python", "metadata": { "slideshow": { "slide_type": "slide" } }, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 1, "text": [ "array([[0, 1, 2],\n", " [3, 4, 5]])" ] } ], "prompt_number": 1 }, { "cell_type": "code", "collapsed": false, "input": [ "a.dtype" ], "language": "python", "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 2, "text": [ "dtype('int64')" ] } ], "prompt_number": 2 }, { "cell_type": "code", "collapsed": false, "input": [ "a.shape" ], "language": "python", "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 3, "text": [ "(2, 3)" ] } ], "prompt_number": 3 }, { "cell_type": "heading", "level": 2, "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "Get and set an element" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "-" } }, "source": [ "Get a (element) value via integer index." ] }, { "cell_type": "code", "collapsed": false, "input": [ "a = np.array([[0, 1, 2], [3, 4, 5]])\n", "a[0, 2]" ], "language": "python", "metadata": { "slideshow": { "slide_type": "-" } }, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 4, "text": [ "2" ] } ], "prompt_number": 4 }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "Set an element." ] }, { "cell_type": "code", "collapsed": false, "input": [ "a[0, 2] = 99\n", "a " ], "language": "python", "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 5, "text": [ "array([[ 0, 1, 99],\n", " [ 3, 4, 5]])" ] } ], "prompt_number": 5 }, { "cell_type": "heading", "level": 2, "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "Why NumPy ndarray?" ] }, { "cell_type": "heading", "level": 3, "metadata": {}, "source": [ "Because lists are not good for numerical calculations." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "Multiplication just repeats." ] }, { "cell_type": "code", "collapsed": false, "input": [ "L1 = [2, 3]\n", "2 * L1" ], "language": "python", "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 6, "text": [ "[2, 3, 2, 3]" ] } ], "prompt_number": 6 }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "Addition concatenates." ] }, { "cell_type": "code", "collapsed": false, "input": [ "L1 = [2, 3]\n", "L2 = [5, 6]\n", "L1 + L2" ], "language": "python", "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 7, "text": [ "[2, 3, 5, 6]" ] } ], "prompt_number": 7 }, { "cell_type": "heading", "level": 2, "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "NumPy `ndarray` provides element-wise operations." ] }, { "cell_type": "code", "collapsed": false, "input": [ "x = np.array([2, 3]) # error if (2, 3) \n", "2 * x" ], "language": "python", "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 8, "text": [ "array([4, 6])" ] } ], "prompt_number": 8 }, { "cell_type": "code", "collapsed": false, "input": [ "y = np.array([5, 6])\n", "x + y" ], "language": "python", "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 9, "text": [ "array([7, 9])" ] } ], "prompt_number": 9 }, { "cell_type": "heading", "level": 2, "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "Familiar mathematical functions (`ufunc`'s) operate element-wise, as well." ] }, { "cell_type": "code", "collapsed": false, "input": [ "x = np.array([1.0, 2.0, 3.0])\n", "np.exp(x), np.sqrt(x), np.log(x)" ], "language": "python", "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 10, "text": [ "(array([ 2.71828183, 7.3890561 , 20.08553692]),\n", " array([ 1. , 1.41421356, 1.73205081]),\n", " array([ 0. , 0.69314718, 1.09861229]))" ] } ], "prompt_number": 10 }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "See the list of available `ufunc`'s [here](http://docs.scipy.org/doc/numpy/reference/ufuncs.html#available-ufuncs)." ] }, { "cell_type": "heading", "level": 2, "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "NumPy array creation" ] }, { "cell_type": "code", "collapsed": false, "input": [ "a = np.array([2, 3, 4], dtype=float) # from list\n", "a, a.dtype, a.shape " ], "language": "python", "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 11, "text": [ "(array([ 2., 3., 4.]), dtype('float64'), (3,))" ] } ], "prompt_number": 11 }, { "cell_type": "code", "collapsed": false, "input": [ "b = np.arange(10) # short-cut for np.array(range(...))\n", "b" ], "language": "python", "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 12, "text": [ "array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])" ] } ], "prompt_number": 12 }, { "cell_type": "heading", "level": 2, "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "Some convenient functions." ] }, { "cell_type": "code", "collapsed": false, "input": [ "Z = np.zeros((2, 3))\n", "Z" ], "language": "python", "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 13, "text": [ "array([[ 0., 0., 0.],\n", " [ 0., 0., 0.]])" ] } ], "prompt_number": 13 }, { "cell_type": "code", "collapsed": false, "input": [ "Ones = np.ones((10,)) \n", "Ones" ], "language": "python", "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 14, "text": [ "array([ 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.])" ] } ], "prompt_number": 14 }, { "cell_type": "code", "collapsed": false, "input": [ "I = np.eye(4)\n", "I" ], "language": "python", "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 15, "text": [ "array([[ 1., 0., 0., 0.],\n", " [ 0., 1., 0., 0.],\n", " [ 0., 0., 1., 0.],\n", " [ 0., 0., 0., 1.]])" ] } ], "prompt_number": 15 }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "5 evenly spaced numbers from 0.0 to 2.0, inclusive at both ends." ] }, { "cell_type": "code", "collapsed": false, "input": [ "x = np.linspace(0.0, 2.0, 5)\n", "x" ], "language": "python", "metadata": { "slideshow": { "slide_type": "slide" } }, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 16, "text": [ "array([ 0. , 0.5, 1. , 1.5, 2. ])" ] } ], "prompt_number": 16 }, { "cell_type": "code", "collapsed": false, "input": [ "%matplotlib inline\n", "import matplotlib.pyplot as plt\n", "\n", "x = np.linspace(0.0, 2.0, 100)\n", "y = np.sin(x * np.pi) + x ** 2 - np.pi\n", "plt.plot(x, y)" ], "language": "python", "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 17, "text": [ "[]" ] }, { "metadata": {}, "output_type": "display_data", "png": "iVBORw0KGgoAAAANSUhEUgAAAX4AAAEACAYAAAC08h1NAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3Xt4VNW5x/HvkAQrdwHLJYknmEQSMIQgGC9Fh0KIBEmR\nVkGlVUTKUZGDWg9S20M4NQGqvahRiqgB1CKXIw0aSAF1wIIxB8ixFVQCiuRCKJcHhRBNCPv8sZSK\nCSSZmcyey+/zPPPkMit7v4zbd9asvda7HJZlWYiISMhoY3cAIiLiW0r8IiIhRolfRCTEKPGLiIQY\nJX4RkRCjxC8iEmI8Tvx33XUXPXr0ICkp6Zxtpk+fTnx8PMnJyZSUlHh6ShER8YDHiX/SpEkUFhae\n8/m1a9eyZ88eSktLee6557jnnns8PaWIiHjA48Q/dOhQLrroonM+v2bNGu644w4AUlNTOXbsGAcP\nHvT0tCIi4qZWH+OvqKggOjr6zM9RUVGUl5e39mlFROQcfHJz97tVIRwOhy9OKyIijQhv7RNERkZS\nVlZ25ufy8nIiIyMbtIuLi2Pv3r2tHY6ISFCJjY1lz549LfqbVu/xZ2ZmsnTpUgCKioro0qULPXr0\naNBu7969WJalhxces2fPtj2GYHro9dTr6c8PdzrMHvf4b731VjZt2sThw4eJjo5mzpw51NXVATB1\n6lQyMjJYu3YtcXFxtG/fnry8PE9PKSIiHvA48S9btqzJNrm5uZ6eRkREvEQrd4OQ0+m0O4SgotfT\nu/R62s9hWZZfbMTicDjwk1BERAKCZUGbNi3Pnerxi4gEoC++gPNUyjkvJX4RkQC0cKH7iV9DPSIi\nAebLL+HSS2HdOhg4UEM9IiJBb/FiSEmB5GT3/l49fhGRAHLqFFx2Gbz0Elx7rXu5Uz1+EZEAsmIF\nREWZpO+uVq/VIyIi3nH6NMydC7/9rWfHUY9fRCRAFBRAeDjccINnx1HiFxEJAJYFOTnwy1+Cp5Xt\nlfhFRAKAywVHj8K4cZ4fS4lfRCQA5OTAI49AWJjnx1LiFxHxc8XFsHs3TJzoneMp8YuI+LmcHHj4\nYYiI8M7xtIBLRMSP/eMfMHIkfPIJXHhhw+dtWcBVWFhIQkIC8fHxzJ8/v8HzLpeLzp07k5KSQkpK\nCo899pinpxQRCRnz5sGMGY0nfXd5tICrvr6eadOmsXHjRiIjIxkyZAiZmZkkJiae1e76669nzZo1\nHgUqIhJq9uyBv/4VFizw7nE96vEXFxcTFxdHTEwMERERTJgwgfz8/AbtNIQjItJy8+bBffdBp07e\nPa5Hib+iooLo6OgzP0dFRVFRUXFWG4fDwdatW0lOTiYjI4Ndu3Z5ckoRkZBQVgavvQbTp3v/2B4N\n9TiasXxs0KBBlJWV0a5dO9atW8fYsWPZvXt3o22zsrLOfO90OrU3p4iErMcfh7vvhm7dzv69y+XC\n5XJ5dGyPZvUUFRWRlZVFYWEhAHPnzqVNmzbMnDnznH/Tp08ftm/fTteuXc8ORLN6REQAOHgQEhNh\n1y7o2fP8bX0+q2fw4MGUlpayb98+amtrWb58OZmZmWe1OXjw4JmgiouLsSyrQdIXEZF/+f3v4bbb\nmk767vJoqCc8PJzc3FzS09Opr69n8uTJJCYmsnDhQgCmTp3KqlWrWLBgAeHh4bRr145XX33VK4GL\niASjo0fh+eehpKT1zqEFXCIifmT2bKioMMm/OdzJnUr8IiJ+4vPPITYW3nvPfG0Obb0oIhLAcnNh\n1KjmJ313qccvIuIHTpyASy+FzZshIaH5f6cev4hIgFqwAIYNa1nSd5d6/CIiNjt50gzvrF8PSUkt\n+1v1+EVEAtCiRXDVVS1P+u5Sj19ExEZffml6+2vWwBVXtPzv1eMXEQkwL7wAgwa5l/TdpR6/iIhN\nvvoK4uJMFc4hQ9w7hnr8IiIBJC/PjOu7m/TdpR6/iIgNamshPh6WLzc3dt2lHr+ISIBYssTM2fck\n6btLPX4RER+rq4PLLoOXX4Zrr/XsWOrxi4gEgCVLzE1dT5O+u9TjFxHxodpa6NvXO719UI9fRMTv\nLVlibura1dsHLyT+wsJCEhISiI+PZ/78+Y22mT59OvHx8SQnJ1PSmtvKiIj4sdpayM6GrCx74/Ao\n8dfX1zNt2jQKCwvZtWsXy5Yt48MPPzyrzdq1a9mzZw+lpaU899xz3HPPPR4FLCISqJYsMcM811xj\nbxweJf7i4mLi4uKIiYkhIiKCCRMmkJ+ff1abNWvWcMcddwCQmprKsWPHOHjwoCenFREJON/09mfP\ntjsSDxN/RUUF0dHRZ36OioqioqKiyTbl5eWenFZEJODk5flHbx8g3JM/djgczWr33TvO5/q7rG8N\nfDmdTpxOp7uhiYj4jS+/hMceg1WrPD+Wy+XC5XJ5dAyPEn9kZCRlZWVnfi4rKyMqKuq8bcrLy4mM\njGz0eFl23/EQEWkFzz8PycmQmur5sb7bKZ4zZ06Lj+HRUM/gwYMpLS1l37591NbWsnz5cjIzM89q\nk5mZydKlSwEoKiqiS5cu9OjRw5PTiogEjJoamDsX/vu/7Y7kXzzq8YeHh5Obm0t6ejr19fVMnjyZ\nxMREFi5cCMDUqVPJyMhg7dq1xMXF0b59e/Ly8rwSuIhIIPjTn+DKK03NfX+hlbsiIq2kuvpfe+kO\nGNA659DKXRERP5KbC9dd13pJ313q8YuItILPPzelGVwu6Nev9c6jHr+IiJ/4wx9g1KjWTfruUo9f\nRMTLDh82m6wUF8Oll7buudTjFxHxA/Pnw803t37Sd5d6/CIiXlRZaTZQ//vf4RxrVb3KndypxC8i\n4kX33QcXXghPPOGb8ynxi4jY6NNPYcgQ+Ogj6N7dN+fUGL+IiI1mz4b77/dd0neXRyUbRETE+Mc/\nzArd0lK7I2maevwiIl7w6KMwaxZ07Gh3JE1Tj19ExENbtphZPCtX2h1J86jHLyLiAcuCRx6BOXPg\nggvsjqZ5lPhFRDywbh0cPQoTJ9odSfMp8YuIuKm+HmbOhJwcCAuzO5rmU+IXEXHT0qXQpQt8Z+NB\nv+f2Aq6jR48yfvx4PvvsM2JiYlixYgVdunRp0C4mJoZOnToRFhZGREQExcXFjQeiBVwiEkBqauCy\ny2DFCrj6avvi8OkCrnnz5pGWlsbu3bsZPnw48+bNO2dQLpeLkpKScyZ9EZFA89RTZktFO5O+u9zu\n8SckJLBp0yZ69OhBVVUVTqeTjz76qEG7Pn36sG3bNrp163b+QNTjF5EAceSIKbu8ZYvp9dvJpz3+\ngwcP0qNHDwB69OjBwYMHzxnUiBEjGDx4MIsWLXL3dCIifiM725Rdtjvpu+u8C7jS0tKoqqpq8Pvs\n7OyzfnY4HDgcjkaPsWXLFnr16sWhQ4dIS0sjISGBoUOHNto2KyvrzPdOpxOn09lE+CIivrV3r7mp\n+8EH9pzf5XLhcrk8OoZHQz0ul4uePXty4MABhg0b1uhQz7fNmTOHDh068NBDDzUMREM9IhIAbr4Z\nBg40JRr8gU+HejIzM1myZAkAS5YsYezYsQ3anDx5kuPHjwNQXV3N+vXrSUpKcveUIiK22rIF3nsP\nHnjA7kg849F0zltuuYX9+/efNZ2zsrKSKVOmUFBQwCeffMK4ceMAOHXqFLfffjuzZs1qPBD1+EXE\nj1mWmcFz333w05/aHc2/aCMWEZFW8uqrZlet4mJo40dLX5X4RURawZdfQmIiLF4M119vdzRn0w5c\nIiKt4I9/hORk/0v67lKPX0TkPA4cgKQkKCqCuDi7o2lIQz0iIl42aRJcfDH89rd2R9I4d3KnduAS\nETmHbdugsBA+/tjuSLxLY/wiIo2wLJgxA37zG+jUye5ovEuJX0SkEcuXQ3W1GeoJNhrjFxH5jupq\nU33zlVfguuvsjub8NJ1TRMQLcnJMwvf3pO8u9fhFRL5lzx646ip4/32IjLQ7mqapxy8i4qEZM+A/\n/zMwkr67NJ1TRORrb7wBpaXw2mt2R9K6lPhFRDD1eGbMgGeegbZt7Y6mdWmoR0QEmDfP1ONJT7c7\nktanm7siEvJKS02t/ZISiI62O5qW8enN3ZUrV9K/f3/CwsLYsWPHOdsVFhaSkJBAfHw88+fPd/d0\nIiKtwrLM5iqzZgVe0neX24k/KSmJ1atXc915JrrW19czbdo0CgsL2bVrF8uWLePDDz9095QiIl63\nYgVUVcH06XZH4jtu39xNSEhosk1xcTFxcXHExMQAMGHCBPLz80lMTHT3tCIiXvPFF/Dggyb5R0TY\nHY3vtOrN3YqKCqK/9dkpKiqKioqK1jyliEizPfoojBoF115rdyS+dd4ef1paGlVVVQ1+n5OTw5gx\nY5o8uMPhcD8yEZFW9O67sGoV7NxpdyS+d97Ev2HDBo8OHhkZSVlZ2Zmfy8rKiIqKOmf7rKysM987\nnU6cTqdH5xcRaUxtLfz85/CHP0DXrnZH0zIulwuXy+XRMTyezjls2DCeeOIJrrjiigbPnTp1ir59\n+/Lmm2/Su3dvrrzySpYtW9boGL+mc4qIr2Rnw9atZqVuoA9M+HQ65+rVq4mOjqaoqIjRo0czatQo\nACorKxk9ejQA4eHh5Obmkp6eTr9+/Rg/frxu7IqIrXbvNj39Z58N/KTvLi3gEpGQcfo0/PCHMHas\nKc8QDFSdU0TkPP70JzO+f//9dkdiL/X4RSQk7NsHgwfD3/5mdtcKFurxi4g0wrJgyhT4xS+CK+m7\nS4lfRILe88/DsWMm8YuGekQkyO3fD1dcAW+9BUlJdkfjfRrqERH5ltOnYdIkU48nGJO+u5T4RSRo\n5eZCTQ08/LDdkfgXDfWISFD66CMYOtTU5ImLszua1qOhHhERoK4OfvpT+M1vgjvpu0uJX0SCTnY2\ndOsGU6faHYl/cnsjFhERf/S3v8HChbBjR+jW4mmKevwiEjSOHYOJE2HRIujVy+5o/Jdu7opIULAs\nmDABvv99ePppu6PxHXdyp4Z6RCQoLF4Mu3aZr3J+6vGLSMDbtQuuvx7efhsuv9zuaHxL0zlFJORU\nV8PNN8P8+aGX9N3lduJfuXIl/fv3JywsjB07dpyzXUxMDAMGDCAlJYUrr7zS3dOJiDRgWXDvvabc\n8qRJdkcTONwe409KSmL16tVMbWKirMPhwOVy0TXQdjQWEb+XlwfbtkFxsaZutoTbiT+hBUWtNXYv\nIt72/vswcyZs2gTt29sdTWBp9TF+h8PBiBEjGDx4MIsWLWrt04lICDh6FMaNg6eegn797I4m8Jy3\nx5+WlkZVVVWD3+fk5DBmzJhmnWDLli306tWLQ4cOkZaWRkJCAkOHDnUvWhEJefX1cOutcNNN5qu0\n3HkT/4YNGzw+Qa+vl89dfPHF3HTTTRQXF58z8WdlZZ353ul04nQ6PT6/iASXX/0KTp2CefPsjsQe\nLpcLl8vl0TE8nsc/bNgwnnjiCa644ooGz508eZL6+no6duxIdXU1I0eOZPbs2YwcObJhIJrHLyJN\nWLnS1Nbftg26d7c7Gv/g03n8q1evJjo6mqKiIkaPHs2oUaMAqKysZPTo0QBUVVUxdOhQBg4cSGpq\nKjfeeGOjSV9EpCnbt5upm6+9pqTvKa3cFRG/V1EBV10FTz5pburKv2jlrogEnepqyMyE++5T0vcW\n9fhFxG+dPm3KMXToYIqvaZFWQ6rOKSJBw7LgwQfh8GH485+V9L1JiV9E/NITT8Cbb8I778AFF9gd\nTXBR4hcRv/PKK5CbC1u2QJcudkcTfJT4RcSvrF9vhnjeeguiouyOJjgp8YuI33jnHbNn7urV0L+/\n3dEEL03nFBG/UFwMP/4xLFsG115rdzTBTYlfRGz397/DmDHwwgswfLjd0QQ/JX4RsdXf/w7p6abE\ncjOL/oqHlPhFxDY7dsDIkaYUw/jxdkcTOnRzVzh5Evbvh88+g4MH4cgRs2jm2DH48kuoqYGvvjIL\naNq0MY/vfQ86djSPzp3h+9+HHj2gZ0+45BLo1k0LbuT8/vd/4cYbYcEClWLwNZVsCCE1NaaH9X//\nBzt3msdHH8EXX0B0tEnYPXuayofdu5uEfuGF5vHNAprTp81GGDU1cPy4eRw7Bv/8p3nTqKqCsjKo\nq4OYGIiLg8REs0tSv35mpoYW48jmzfCTn5gxfQ3veMad3KnEH8SOHAGXC95+G9591yT5fv1g0CCT\ngPv3N0m5Z0/Ti/emY8fMJ4jdu+HDD83jgw9g71647DITw5VXwjXXmDjCwrx7fvFff/kLTJliyjCk\npdkdTeBT4g9xp0+bmuX5+bB2LezZAz/4Afzwh2Z6XEqKGaKxU02NeQPYvt1M39u6FQ4cgNRUcDph\n2DAYPBgiIuyNU1rHokUweza8/jo0sneTuEGJPwRZlunN//nPZtFLp06mhO2YMSaZBkICPXLELM3/\n5tPJ3r1w3XVmpkd6OsTH635BoLMsmDMHXnoJCgvNf1PxDp8m/ocffpg33niDtm3bEhsbS15eHp07\nd27QrrCwkBkzZlBfX8/dd9/NzJkzvRZ8KPvkE8jLMzVNLrgAbr/dlK/t29fuyDx35IgpzvXXv5rH\nBReYm4Bjxpg3hLZt7Y5QWqKmBiZNgn37zDBPz552RxRcfJr4N2zYwPDhw2nTpg2PPPIIAPO+s/tx\nfX09ffv2ZePGjURGRjJkyBCWLVtGYmKiV4IPNadOwZo1sHChGSqZOBF+9jMzhBOsPWLLgn/8wwwN\nvPGGuU9xww1w000wapSZVST+68AB+NGPTA//hRfsH2oMRj7dgSstLY02X98RTE1Npby8vEGb4uJi\n4uLiiImJISIiggkTJpCfn+/uKUPW55/D734HsbHm68SJZubMH/9obpIGa9IH828bMAAefdQMaX34\nobkPkJcHkZFmWOull8xrJP5l61ZzAz8zE15+WUnfn3hlLseLL75IRkZGg99XVFQQHR195ueoqCgq\nKiq8ccqQUFUFv/gFXHqp6eH/z/+YsfCf/tRMsQxFPXvCz38O69aZN79bboFVq8xU1MxMM/R1/Ljd\nUYY2y4Lf/958KluwAH71q+DunASi8y7gSktLo6qqqsHvc3JyGPP15Nvs7Gzatm3Lbbfd1qCdo4X/\ntbOyss5873Q6cTqdLfr7YFFRAb/9renJTpwIJSUmscnZOnc2r8/EiWYtwpo1psDXvfea1aC33goZ\nGepp+tKxY3DXXeZN+b33zFoO8S6Xy4XL5fLsIJYH8vLyrGuuucaqqalp9Pl3333XSk9PP/NzTk6O\nNW/evEbbehhKUDh82LIefNCyLrrIsh54wLIqK+2OKDAdOWJZzz1nWcOGmdfyrrssa+NGyzp1yu7I\ngtubb1pWdLRlTZtmWV9+aXc0ocOd3Ol2tl23bp3Vr18/69ChQ+dsU1dXZ1166aXWp59+an311VdW\ncnKytWvXrsYDCeHEX11tWTk5ltWtm2X9+78r4XtTebllPfGEZQ0aZFm9e5s31h07LOv0absjCx41\nNaaj0ru3Za1bZ3c0oced3On2GP/999/PiRMnSEtLIyUlhXvvvReAyspKRo8eDUB4eDi5ubmkp6fT\nr18/xo8f3+iMnlBlWWZoIiHBDOds3WrGRHv1sjuy4BEZCQ89ZO6RbNxo7o2MG2dWC+fkmCmG4r7N\nm82ssrIyU2XzhhvsjkiaQwu4bFJSAtOnQ3W1KUf7gx/YHVHosCzzJvvKK7BihXnj/WYdRPfudkcX\nGI4cgYcfhg0bzPU7dqxu4NrFp9M5xT1ffAH/8R9mDvrPfmYqFCrp+5bDYUpYPPssVFbCI4+Ynmts\nLIwebd4QTpywO0r/VFdnXrf+/c0aip07zewdJf3AosTvI5ZlpmP27296+Tt3mkJVKk5mr7Ztzarg\nZcugvBxuu82Uv4iMNPXhX3vNrDwNdZZlZk0lJZnXpLDQ1NDv1MnuyMQdGurxgaoquOces+p04UJT\ndkD82+HD5o16xQpzf2D0aDMUlJ4eWmsoLMuUzfjNb8xUzccfN59W1cP3HyrS5mcsy/QeH3wQ7r4b\n/uu/VIs+EFVVmV7uqlXmTWDkSLMp+KhRZi1BMKqvNyUysrPNJ9Rf/cosltMnVP+jxO9H/vlPs8J0\n715YvFglaIPF4cOm7PXq1ea+QGqqqUWTkWFWWAe6I0fgxRfNOP7FF8PMmWYM39v7NYj3KPH7iYIC\nM37/s5+ZUrTq5Qen6mpYv96MfRcWmvHuUaPMJ4LrroMOHeyOsHlqa81wziuvmK8/+hHcdx8MGWJ3\nZNIcSvw2O3nS1NZZuxaWLtVYfig5fRref9/8t9+40czWGjjQFJQbOhSuusq/boSeOGFKXxcUmE8v\nffua0hc332z2S5bAocRvo507zSyQAQPMIqxgHfuV5jl50qwVePttU1hv2zaz//CVV5phvyuuMDNk\nfPVp8ORJs+PZ3/5mhqjefdfEMnq0Gcrp08c3cYj3KfHbwLJMnfFZs0xhtTvv1IwHaai21iza27bN\n3CDevt3sR3zJJWbf48REc4/g3/7NFDbr3Rvat2/ZtWRZcPQo7N9v9jv+Zp/jDz4w23AOGGDWL3yz\nHac/fQIR9ynx+1h1NUydaj7ir1hh/ucVaa66OpOQd+0ySfrTT00JiX37zAYmlmVusHbtCu3amWmk\nF15ofl9fbx41NWYvgmPHzI3ZCy4wbyaXXGKGb5KS4PLLoV+/0JqGGkqU+H3o44/NlL4hQ+CZZ8z/\nmCLeVF0Nhw6ZXnxNzb8eDoeZVtmmjUnmF10EXbqYr4FyQ1m8R4nfR1auNDXf586FyZM1tCMi9nEn\nd553IxY5W3292QJw+XIz7W3QILsjEhFpOSX+Zjp61NRxqaszU/VUxVFEApXW4zXDzp1m6lv//qan\nr6QvIoFMPf4mFBTApEnwu9+ZTc5FRAKd24n/4Ycf5o033qBt27bExsaSl5dH50ZWLcXExNCpUyfC\nwsKIiIiguLjYo4B9xbJMsv/9701tlquvtjsiERHvcHtWz4YNGxg+fDht2rThkUceAWDevHkN2vXp\n04ft27fTtWvX8wfiR7N6amtNGeXt200dlksusTsiEZHG+XQHrrS0NNp8XbIvNTWV8vLyc7b1l4Te\nHMeOmUJbhw6Z5e1K+iISbLxyc/fFF18kIyOj0eccDgcjRoxg8ODBLFq0yBunazWffgrXXGNWO65e\nrcUwIhKczjvGn5aWRlVVVYPf5+TkMGbMGACys7Np27Ytt912W6PH2LJlC7169eLQoUOkpaWRkJDA\n0KFDG22blZV15nun04nT6WzmP8NzxcVmw+hf/hKmTfPZaUVEWsTlcuFyuTw6hkcrdxcvXsyiRYt4\n8803+d73vtdk+zlz5tChQwceeuihhoHYOMb/+utmBe4LL8DX72ciIgHBp2P8hYWFPP744+Tn558z\n6Z88eZLjx48DUF1dzfr160lKSnL3lK1iwQJTaK2gQElfREKD2z3++Ph4amtrz8zWufrqq3n22Wep\nrKxkypQpFBQU8MknnzBu3DgATp06xe23386sWbMaD8THPX7LMvuIrlwJ69ZBbKzPTi0i4jUq0tZM\ndXWml79zp9lQ+uKLfXJaERGvU5G2ZqiuhltuMT3+t94ym12IiISSkKrVc+QIjBgB3/++WY2rpC8i\noShkEn95udn0+rrr4MUXISLC7ohEROwREon/44/NPqN33QXz52vjFBEJbUE/xr99O9x4o9kt6847\n7Y5GRMR+QZ34XS5zI3fRIvjRj+yORkTEPwTtUM+aNSbpL1+upC8i8m1Bmfhffhl+/nOzGnfYMLuj\nERHxL0E31PPss2Y8/623oF8/u6MREfE/QZX45841hdY2b4Y+feyORkTEPwVF4rcsmDXLlF/YvBl6\n97Y7IhER/xXwif/0abjvPti2DTZtgm7d7I5IRMS/BXTiP3UKJk2Czz6DN9+ETp3sjkhExP8FbOL/\n6iu49VaoqYHCQmjXzu6IREQCQ0BO5zx5EjIzTemFv/xFSV9EpCUCLvF//jmkp0PPnmZx1gUX2B2R\niEhgcTvx//rXvyY5OZmBAwcyfPhwysrKGm1XWFhIQkIC8fHxzJ8/3+1AwZRVHj4ckpIgLw/CA3ag\nSkTEPm7vwHX8+HE6duwIwNNPP83777/P888/f1ab+vp6+vbty8aNG4mMjGTIkCEsW7aMxMTEhoE0\nsYvMgQMwciSMGqUKmyIi3/DpZuvfJH2AEydO0L179wZtiouLiYuLIyYmhoiICCZMmEB+fn6Lz/XZ\nZ6aO/vjxSvoiIp7yaLDk0Ucf5aWXXqJdu3YUFRU1eL6iooLo6OgzP0dFRfHee++16BylpWbXrAce\ngBkzPIlWRESgicSflpZGVVVVg9/n5OQwZswYsrOzyc7OZt68eTzwwAPk5eWd1c7Rwq55VlbWme+d\nTifdujm54QaYMwfuvrtFhxIRCUoulwuXy+XRMdwe4/+2/fv3k5GRwQcffHDW74uKisjKyqKwsBCA\nuXPn0qZNG2bOnNkwkO+MUxUXw5gx8OSTMGGCpxGKiAQnn47xl5aWnvk+Pz+flJSUBm0GDx5MaWkp\n+/bto7a2luXLl5OZmdnksV0uGD3aFFxT0hcR8S63x/hnzZrFxx9/TFhYGLGxsSxYsACAyspKpkyZ\nQkFBAeHh4eTm5pKenk59fT2TJ09udEbPtxUUmC0SV6xQLX0RkdbglaEeb3A4HPz5zxYzZkB+Plx1\nld0RiYj4P3eGevwq8ffubVFYaBZoiYhI0wI+8e/ZYxEba3ckIiKBI+ATv5+EIiISMHw6q0dERAKT\nEr+ISIhR4hcRCTFK/CIiIUaJX0QkxCjxi4iEGCV+EZEQo8QvIhJilPhFREKMEr+ISIhR4hcRCTFK\n/CIiIcbtjVh+/etfs2bNGhwOB926dWPx4sVnbaz+jZiYGDp16kRYWBgREREUFxd7FLCIiHjG7eqc\nx48fp2PHjgA8/fTTvP/++zz//PMN2vXp04ft27fTtWvX8wei6pxe43K5cDqddocRNPR6epdeT+/y\naXXOb5I+wIkTJ+jevfs52yqh+5bL5bI7hKCi19O79Hraz+2hHoBHH32Ul156iXbt2lFUVNRoG4fD\nwYgRIwgcGfl2AAAENUlEQVQLC2Pq1KlMmTLFk1OKiIiHztvjT0tLIykpqcHj9ddfByA7O5v9+/dz\n55138sADDzR6jC1btlBSUsK6det45plneOedd7z/rxARkWbzyg5c+/fvJyMjgw8++OC87ebMmUOH\nDh146KGHGjwXFxfH3r17PQ1FRCSkxMbGsmfPnhb9jdtDPaWlpcTHxwOQn59PSkpKgzYnT56kvr6e\njh07Ul1dzfr165k9e3ajx2tp4CIi4h63E/+sWbP4+OOPCQsLIzY2lgULFgBQWVnJlClTKCgooKqq\ninHjxgFw6tQpbr/9dkaOHOmdyEVExC1+s9m6iIj4hk9X7hYWFpKQkEB8fDzz589vtM306dOJj48n\nOTmZkpISX4YXcJp6PV0uF507dyYlJYWUlBQee+wxG6IMDHfddRc9evQgKSnpnG10bTZfU6+nrs3m\nKysrY9iwYfTv35/LL7+cp556qtF2Lbo+LR85deqUFRsba3366adWbW2tlZycbO3ateusNgUFBdao\nUaMsy7KsoqIiKzU11VfhBZzmvJ5vv/22NWbMGJsiDCybN2+2duzYYV1++eWNPq9rs2Waej11bTbf\ngQMHrJKSEsuyLOv48ePWZZdd5nHu9FmPv7i4mLi4OGJiYoiIiGDChAnk5+ef1WbNmjXccccdAKSm\npnLs2DEOHjzoqxADSnNeT9DiueYaOnQoF1100Tmf17XZMk29nqBrs7l69uzJwIEDAejQoQOJiYlU\nVlae1aal16fPEn9FRcVZtXyioqKoqKhosk15ebmvQgwozXk9HQ4HW7duJTk5mYyMDHbt2uXrMIOG\nrk3v0rXpnn379lFSUkJqaupZv2/p9enRyt2WcDgczWr33V5Ac/8u1DTndRk0aBBlZWW0a9eOdevW\nMXbsWHbv3u2D6IKTrk3v0bXZcidOnOAnP/kJTz75JB06dGjwfEuuT5/1+CMjIykrKzvzc1lZGVFR\nUedtU15eTmRkpK9CDCjNeT07duxIu3btABg1ahR1dXUcPXrUp3EGC12b3qVrs2Xq6ur48Y9/zMSJ\nExk7dmyD51t6ffos8Q8ePJjS0lL27dtHbW0ty5cvJzMz86w2mZmZLF26FICioiK6dOlCjx49fBVi\nQGnO63nw4MEzvYDi4mIsy2qySqo0Ttemd+nabD7Lspg8eTL9+vVjxowZjbZp6fXps6Ge8PBwcnNz\nSU9Pp76+nsmTJ5OYmMjChQsBmDp1KhkZGaxdu5a4uDjat29PXl6er8ILOM15PVetWsWCBQsIDw+n\nXbt2vPrqqzZH7b9uvfVWNm3axOHDh4mOjmbOnDnU1dUBujbd0dTrqWuz+bZs2cLLL7/MgAEDzlRI\nyMnJYf/+/YB716cWcImIhBhtvSgiEmKU+EVEQowSv4hIiFHiFxEJMUr8IiIhRolfRCTEKPGLiIQY\nJX4RkRDz/y7eUMrzt8cQAAAAAElFTkSuQmCC\n", "text": [ "" ] } ], "prompt_number": 17 }, { "cell_type": "heading", "level": 2, "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "Many unary operations are implemented as methods." ] }, { "cell_type": "code", "collapsed": false, "input": [ "np.random.seed(12345)\n", "a = np.random.random((2, 4))\n", "a" ], "language": "python", "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 18, "text": [ "array([[ 0.92961609, 0.31637555, 0.18391881, 0.20456028],\n", " [ 0.56772503, 0.5955447 , 0.96451452, 0.6531771 ]])" ] } ], "prompt_number": 18 }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "Sum of all elements, regardless of shape." ] }, { "cell_type": "code", "collapsed": false, "input": [ "a.sum()" ], "language": "python", "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 19, "text": [ "4.4154320862971987" ] } ], "prompt_number": 19 }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "Sum of each column." ] }, { "cell_type": "code", "collapsed": false, "input": [ "a.sum(axis=0)" ], "language": "python", "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 20, "text": [ "array([ 1.49734112, 0.91192026, 1.14843333, 0.85773738])" ] } ], "prompt_number": 20 }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "Sum of each row." ] }, { "cell_type": "code", "collapsed": false, "input": [ "a.sum(axis=1)" ], "language": "python", "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 21, "text": [ "array([ 1.63447074, 2.78096135])" ] } ], "prompt_number": 21 }, { "cell_type": "heading", "level": 2, "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "Changing the shape" ] }, { "cell_type": "code", "collapsed": false, "input": [ "c = np.arange(10) \n", "c" ], "language": "python", "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 22, "text": [ "array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])" ] } ], "prompt_number": 22 }, { "cell_type": "code", "collapsed": false, "input": [ "c.shape = (5, 2)\n", "c" ], "language": "python", "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 23, "text": [ "array([[0, 1],\n", " [2, 3],\n", " [4, 5],\n", " [6, 7],\n", " [8, 9]])" ] } ], "prompt_number": 23 }, { "cell_type": "code", "collapsed": false, "input": [ "d = c.T # transpose() also works\n", "d" ], "language": "python", "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 24, "text": [ "array([[0, 2, 4, 6, 8],\n", " [1, 3, 5, 7, 9]])" ] } ], "prompt_number": 24 }, { "cell_type": "code", "collapsed": false, "input": [ "f = d.flatten() # ravel() also flattens\n", "f" ], "language": "python", "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 25, "text": [ "array([0, 2, 4, 6, 8, 1, 3, 5, 7, 9])" ] } ], "prompt_number": 25 }, { "cell_type": "code", "collapsed": false, "input": [ "f = np.array([0, 2, 4, 6, 8, 1, 3, 5, 7, 9])\n", "g = f.reshape(5, 2)\n", "g" ], "language": "python", "metadata": { "slideshow": { "slide_type": "slide" } }, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 26, "text": [ "array([[0, 2],\n", " [4, 6],\n", " [8, 1],\n", " [3, 5],\n", " [7, 9]])" ] } ], "prompt_number": 26 }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "Array elements order is, by default, rightmost index *changes the fastest* (C-style). This applies both when the array is flattened and is (re)shaped." ] }, { "cell_type": "heading", "level": 2, "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "Slicing works as expected, but returns a view." ] }, { "cell_type": "code", "collapsed": false, "input": [ "a = np.arange(15).reshape(3, 5)\n", "a" ], "language": "python", "metadata": { "slideshow": { "slide_type": "-" } }, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 27, "text": [ "array([[ 0, 1, 2, 3, 4],\n", " [ 5, 6, 7, 8, 9],\n", " [10, 11, 12, 13, 14]])" ] } ], "prompt_number": 27 }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "A view of the third row and all columns." ] }, { "cell_type": "code", "collapsed": false, "input": [ "v = a[2, :]\n", "v" ], "language": "python", "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 28, "text": [ "array([10, 11, 12, 13, 14])" ] } ], "prompt_number": 28 }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "Change a value of a view like so:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "v[0] = 999\n", "v" ], "language": "python", "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 29, "text": [ "array([999, 11, 12, 13, 14])" ] } ], "prompt_number": 29 }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "You change the underlying array data as well." ] }, { "cell_type": "code", "collapsed": false, "input": [ "a" ], "language": "python", "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 30, "text": [ "array([[ 0, 1, 2, 3, 4],\n", " [ 5, 6, 7, 8, 9],\n", " [999, 11, 12, 13, 14]])" ] } ], "prompt_number": 30 }, { "cell_type": "heading", "level": 2, "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "In order to create an independent copy, use copy() method." ] }, { "cell_type": "code", "collapsed": false, "input": [ "b = a.copy()\n", "b[2, 0] = 888\n", "b" ], "language": "python", "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 31, "text": [ "array([[ 0, 1, 2, 3, 4],\n", " [ 5, 6, 7, 8, 9],\n", " [888, 11, 12, 13, 14]])" ] } ], "prompt_number": 31 }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "a remains unchanged." ] }, { "cell_type": "code", "collapsed": false, "input": [ "a " ], "language": "python", "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 32, "text": [ "array([[ 0, 1, 2, 3, 4],\n", " [ 5, 6, 7, 8, 9],\n", " [999, 11, 12, 13, 14]])" ] } ], "prompt_number": 32 }, { "cell_type": "heading", "level": 2, "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "Boolean indexing returns an array and works great for setting some cells to certain values." ] }, { "cell_type": "code", "collapsed": false, "input": [ "b = a.copy()\n", "idx = np.logical_or(b == 9, b == 999)\n", "idx" ], "language": "python", "metadata": { "slideshow": { "slide_type": "-" } }, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 33, "text": [ "array([[False, False, False, False, False],\n", " [False, False, False, False, True],\n", " [ True, False, False, False, False]], dtype=bool)" ] } ], "prompt_number": 33 }, { "cell_type": "code", "collapsed": false, "input": [ "b[idx] = 0\n", "b" ], "language": "python", "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 34, "text": [ "array([[ 0, 1, 2, 3, 4],\n", " [ 5, 6, 7, 8, 0],\n", " [ 0, 11, 12, 13, 14]])" ] } ], "prompt_number": 34 }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "Selecting the first and the third rows." ] }, { "cell_type": "code", "collapsed": false, "input": [ "idx = np.array([True, False, True])\n", "r = b[idx, :]\n", "r" ], "language": "python", "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 35, "text": [ "array([[ 0, 1, 2, 3, 4],\n", " [ 0, 11, 12, 13, 14]])" ] } ], "prompt_number": 35 }, { "cell_type": "heading", "level": 2, "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "For matrix multiplication, use `np.dot`." ] }, { "cell_type": "code", "collapsed": false, "input": [ "M = np.arange(6.0).reshape(3,2)\n", "M" ], "language": "python", "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 36, "text": [ "array([[ 0., 1.],\n", " [ 2., 3.],\n", " [ 4., 5.]])" ] } ], "prompt_number": 36 }, { "cell_type": "code", "collapsed": false, "input": [ "N = 2 * M.T\n", "N" ], "language": "python", "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 37, "text": [ "array([[ 0., 4., 8.],\n", " [ 2., 6., 10.]])" ] } ], "prompt_number": 37 }, { "cell_type": "code", "collapsed": false, "input": [ "M * N" ], "language": "python", "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "ename": "ValueError", "evalue": "operands could not be broadcast together with shapes (3,2) (2,3) ", "output_type": "pyerr", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)", "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mM\u001b[0m \u001b[0;34m*\u001b[0m \u001b[0mN\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;31mValueError\u001b[0m: operands could not be broadcast together with shapes (3,2) (2,3) " ] } ], "prompt_number": 38 }, { "cell_type": "code", "collapsed": false, "input": [ "np.dot(M, N)" ], "language": "python", "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 39, "text": [ "array([[ 2., 6., 10.],\n", " [ 6., 26., 46.],\n", " [ 10., 46., 82.]])" ] } ], "prompt_number": 39 }, { "cell_type": "heading", "level": 2, "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "One dimensional array is a one dimensional array." ] }, { "cell_type": "code", "collapsed": false, "input": [ "v = np.ones(2.,)\n", "v" ], "language": "python", "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 40, "text": [ "array([ 1., 1.])" ] } ], "prompt_number": 40 }, { "cell_type": "code", "collapsed": false, "input": [ "np.all(v == v.T)" ], "language": "python", "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 41, "text": [ "True" ] } ], "prompt_number": 41 }, { "cell_type": "code", "collapsed": false, "input": [ "M, v" ], "language": "python", "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 42, "text": [ "(array([[ 0., 1.],\n", " [ 2., 3.],\n", " [ 4., 5.]]), array([ 1., 1.]))" ] } ], "prompt_number": 42 }, { "cell_type": "code", "collapsed": false, "input": [ "np.dot(M, v)" ], "language": "python", "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 43, "text": [ "array([ 1., 5., 9.])" ] } ], "prompt_number": 43 }, { "cell_type": "heading", "level": 2, "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "Reference for all the NumPy methods and routines found at the [reference page](http://docs.scipy.org/doc/numpy/reference/routines.html)" ] }, { "cell_type": "heading", "level": 2, "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "An Example: Random Walks" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "> This example is mostly based on a section in McKinney (2012, Ch.4), except that a step can be taken one of the three, not two, directions. All the code has been re-written." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "-" } }, "source": [ "Let's simulate a simple random walk.\n", "\n", "Let $t = 0, 1, \\ldots$ denote (discrete) time. Starting from the initial position of 0, a step is taken randomly either to a positive direction (+1), to a neutral direction (0), or to a negative direction (-1) at each time. A $walk$ is a list of positions indexed by time, $t$." ] }, { "cell_type": "heading", "level": 2, "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "Without NumPy" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The function, `randint(a, b)`, returns an integer from the range `a` to `b`, inclusive at both ends." ] }, { "cell_type": "code", "collapsed": false, "input": [ "import random\n", "\n", "rnd = random.Random(1234)\n", "T = range(21) \n", "walk = []\n", "\n", "for t in T: \n", " if t == 0: \n", " pos = 0\n", " else:\n", " step = rnd.randint(0, 2) - 1 \n", " pos += step\n", " walk.append(pos)\n", "\n", "print \"walk = \", walk\n", "plt.plot(T, walk) " ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "walk = [0, 1, 1, 0, 1, 2, 2, 3, 2, 3, 2, 1, 2, 2, 2, 2, 1, 0, -1, -2, -2]\n" ] }, { "metadata": {}, "output_type": "pyout", "prompt_number": 44, "text": [ "[]" ] }, { "metadata": {}, "output_type": "display_data", "png": "iVBORw0KGgoAAAANSUhEUgAAAXMAAAEACAYAAABBDJb9AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAGddJREFUeJzt3X1sVfUdx/HPRUo2BRE2KEi7deuDUCi93Qg4AuRWLDgc\nD4Joh4MiLFtmyGTDJfOfrVsykMWH4cayZPGhMGVOEx6WSAczXnGoIY7WMCgqCFIqOECYMnCFcvfH\nsaXQnvbee57Peb+SJn3inq/Xw/f++P4+59xYKpVKCQAQaH28LgAAYB3NHABCgGYOACFAMweAEKCZ\nA0AI0MwBIAQsNfNPP/1UEyZMUDweV2lpqR588EG76gIAZCBmNWd+7tw5XXvttbp48aImTZqkhx9+\nWJMmTbKrPgBAGiyPWa699lpJUmtrq9ra2jR48GDLRQEAMmO5mV+6dEnxeFy5ubmqrKxUaWmpHXUB\nADJguZn36dNHjY2NOnr0qHbs2KFkMmlDWQCATPS164EGDhyo22+/XW+++aYSiUTH94uKinTw4EG7\nDgMAkVBYWKgDBw6k/fuWVuYnT57UmTNnJEnnz5/X9u3bVVFRccXvHDx4UKlUig+bPn7+8597duw9\ne1K68caUpkxJ6fnnvXsO5sxJacGClOLx4D6XYfzg+bT3I9NFsKWV+bFjx1RTU6NLly7p0qVLWrhw\noaZOnWrlIeFjdXXSokXSqFHS009Ld97pfg0nTkgvvyy9/75UViY1NkrxuPt1AH5jqZmXlZVp9+7d\ndtUCH7t4UfrTn4xGmp8v3X+/dOyYNHy4u3U8+6w0a5Y0cKBUU2O8wNDMAa4ADZzO+xFu+tvfpIIC\naeRI6brrpDvukJ55xv06nn5aWrzY+LymxqihtTW7x/LquQwrnk9vWb5oqNcDxGJy+BBwwfz50q23\nSt//vvH1jh3SffdJe/ZIsZg7NTQ2SrNnS4cOSX0+W4ZMniw98IDxfSBMMu2drMzRq1OnpG3bpLvv\nvvy9SZOk8+elf/7TvTrq6ozVeJ9OZ+3ixcZqHYg6mjl69ec/SzNmSDfccPl7ffoYjdWtRtraaszL\na2qu/P78+cYc/8QJd+oA/Ipmjl51nlN3tmiR0ej/9z/na9i6VbrpJqmw8MrvX3+9NHOm0eiBKKOZ\no0f/+pf0wQfGvPxqBQXS2LHSX//qfB1mLygSoxZAopmjF+3Z8muu6f7nbjTS9mz5/Pnd/7yy0pjr\nNzY6WwfgZzRzmGrPll89p+5s3jxp504jc+6U9mz5gAHd/7x9fl9X51wNgN/RzGGqc7bcjBuZ855G\nLO2sZs6BoKOZw1Q6TVS6PGpx4nKCxkbpo4+k3q5HKSoyNki3brW/BiAIaOboVnfZcjNOZs67y5ab\nYSMUUUYzR7e6y5abcSpzbpYtN0PmHFFGM0e30h2xtHMic26WLTdD5hxRRjNHFz1ly804kTnP9AVF\nYtSC6KKZo4vesuVm7GykvWXLzZA5R1TRzHGFdLLlZuzMnPeWLTdD5hxRRTPHFdLJlpuxM3OezYil\nHZlzRBHNHFew0kQlezLn6WbLzZA5RxTRzNEhk2y5mcmTrWfOM8mWm2EjFFFDM0eHTLLlZmIxa400\n02y5mbvuInOOaKGZo4PVEUs7K5nzTLPlZgYMMDZQyZwjKmjmkJRdttzMl78slZdnlzm36wVFYtSC\naKGZQ1L22XIz2TTSbLPlZhIJYyOVzDmigGYOS9lyM3PnZp45zzZbbobMOaKEZg5L2XIz111nNPRM\nMud2jlja1dQYLxJkzhF2NHM40kSlzDLnVrPlZgoLyZwjGmjmEWdHttxMJvc5tyNbboaNUEQBzTzi\n7MiWm0k3c25XttwM9zlHFNDMI86pEUu7dDLndmXLzZA5RxTQzCPMzmy5mXQy506/oEiMWhB+NPMI\nsztbbqanRmp3ttwMmXOEHc08opzIlpvpKXNud7bcDJlzhB3NPKKcyJab6Slz7saIpR2Zc4QZzTyi\n3GyiUveZc6ey5WbInCPMaOYR5GS23Ex3mXMns+Vm2AhFWNHMI8jJbLmZqzPnTmfLzZA5R1hZaubN\nzc2qrKzU6NGjNWbMGD3++ON21QUHuT1iadc5c+50ttwMmXOElaVmnpOTo8cee0x79+7VG2+8obVr\n16qpqcmu2uAAN7LlZjpnzr16QZEYtSCcLDXzYcOGKR6PS5L69++vUaNG6YMPPrClMDjDrWy5mcWL\npUcfdSdbbobMOcKor10PdPjwYTU0NGjChAl2PSSusn+/1NKS/Z9PpYxs+csv21dTpubOle67T7rj\nDuez5WY6Z84/W4t45uhR6e23va3BLuPHe/f/FDY187Nnz+rOO+/UmjVr1L9//y4/r62t7fg8kUgo\n4VYWLUROn5YmTJDGjbP2ONXV7mTLzVx3nbRqlTR5snc1SEYznzhRWr1a6tfPmxpSKWnqVGnoUO9q\nsMvJk8YIbd06rysJrmQyqWQymfWfj6VS6dxt2tyFCxf0rW99S9/85je1fPnyrgeIxWTxEJD0hz8Y\nK+rnnvO6kvCYMkVasUKaPdub47/2mrR0qbRvn5H2CbITJ6TiYunIEen6672uJhwy7Z2WZuapVEpL\nly5VaWlpt40c9vFywzCsvN4Ibf9/GvRGLklDhkiVldILL3hdSXRZWpn/4x//0JQpUzR27FjFPjsj\nV61apdtuu+3yAViZW9bUZPxz/MgRqa9tuxz45BMpP196912jGbnp3DkpL0/as0caMcLdYztl82bp\nkUekHTu8riQcMu2dlscsvR6AZm7ZT39qzFdXr/a6kvBZtEj6+tel++9397jPPiutXx+uWwtcuGC8\nQO3cKRUVeV1N8Lk6ZoHz2tqMv/RuXykZFV6NWsI4NsvJkRYsYBPUKzRzn9u+3VjtlJZ6XUk4eZE5\nb2427lHj1carkxYvNiKfly55XUn00Mx9LowrOD/x4j7n69dLd90lfe5z7h3TLeXl0uDBkoWEHbLE\nzNzHTp+WvvIV6dAhadAgr6sJr4MHjcx5c7Pzee9Uyrgnzfr1xnUDYbRmjfEvD8Yt1jAzD5HnnpOm\nT6eRO83N+5y//rpxK4Xx450/llcWLJC2bJE+/tjrSqKFZu5jjFjc49ZGaJiy5WbInHuDMYtPkS13\nlxuZ8zBmy82QObeOMUtI1NVJCxfSyN3ixn3ON20y5uRhb+SS8eYnb78tHTjgdSXRQTP3IbLl3nB6\n1BKlsRmZc/fRzH2IbLk3nMychzlbbobMubto5j709NOsyr3gZOZ8/XrjzTjCmC03U15uJLHInLuD\nDVCfOX1aKigwsuWDB3tdTfQ4kTlvz5avWyfdfLM9jxkUv/mNtHs345ZssAEacO3Zchq5N5zInL/+\nurHqD+tFQj0hc+4emrnPRGmTzK/s3giNQrbczNChxl4EmXPnMWbxkaYm6ZZbjH/iE0n0jp2Z8yhl\ny81s2mS8iTeZ88wwZgkwsuX+YGfmfNMm49L9qDZyycic799P5txpNHOfIFvuL3aNWhibGRvJZM6d\nRzP3ie3bjdXb6NFeVwLJnsx5c7P05pvRypabIXPuPJq5T7CC85c+fYy3lLOSOW+/b/nnP29fXUEV\nj5M5dxoboD5AttyfDhwwMudHj2aeOY9yttwMmfPMsAEaQGTL/amoKPvMeZSz5WbInDuLZu4DjFj8\nK9uN0Chny82QOXcWYxaPkS33t48/lr70pcwy52TLzZE5Tx9jloAhW+5v118vzZyZWeacbLk5MufO\noZl7iGx5MGQ6amFsZo7MuXNo5h4iWx4MlZXSqVPpZc7JlveOzLkzaOYeYgUXDJnc55xsee/InDuD\nDVCPkC0PlnQy52TL00fmvHdsgAYE2fJgSSdzTrY8fWTO7Ucz9wgjluDpbSOUbHn6yJzbjzGLB8iW\nB1NPmXOy5Zkjc94zxiwBQLY8mHrKnJMtzxyZc3vRzF1GtjzYzEYtjM0yR+bcXjRzl5EtD7buMudk\ny7NH5tw+NHOXsYILtu4y52TLs0fm3D6Wm/mSJUuUm5ursrIyO+oJtdOnjWhbdbXXlcCKmhrpmWek\n1lYjW84LtDV2vUVf1Flu5vfee6/q6+vtqCX0yJaHQ+fMOdly68ic28NyM588ebIGDRpkRy2hxwou\nPNpXk2TLrSNzbg9m5i5papLef1+aNs3rSmCH+fOll1+Wnn/eiJnCGkYt1vk+6fzww9LevdYeo6RE\nevBBe+rJFtnycGnPnJ84QbbcDjNmSN/7npE5LyryuppgcqW11NbWdnyeSCSUSCTS+nPvvSetXi39\n+tfWjv/gg9Lcucac0wvt2fJt27w5Ppzx8MPSp596XUU4dM6c//KXXlfjjWQyqaSFWI8tl/MfPnxY\nM2fO1J49e7oewMLl/LW1RgJkzRpr9T3wgHGyrFxp7XGyVV8v/exn0q5d3hwfCILGRiOrf+iQsakc\nda5fzv/tb39bEydO1DvvvKP8/Hw99dRTVh9SknERQV2dPRuGNTXGK35bm/XHygYbn0DvyJxb49sb\nbSWT0v33G6/WdiQFxo0zVuZub0By33Igfdzn/LLQ3GjL7siXV7vlZMuB9JE5z54vV+Znz0r5+dLb\nbxsZVDucOiV99atGPPCGG+x5zHTcfLMxL58xw71jAkE2Z440a5a0ZInXlXgrFCvzF16Qpkyxr5FL\n0he+IFVVSX/5i32P2Ruy5UDmyJxnx5fN3KkNQ7dPErLlQOa4z3l2fDdmee894z4XLS3mb5ybrQsX\njPHNK684nzlvazPelWbbNm53C2Rq+XLjwqyoZs6lEIxZ1q0zNkHsbuSSlJMjfec7V96+1CnctxzI\nHvc5z5yvmrmd2XIzbmXOyZYD2SNznjlfNfMdO4x/WsXjzh2jrEwaNkx66SXnjsF9ywHr2AjNjK+a\nuVu3E3X6JCFbDlhH5jwzvtkAdSJbbsbpzDnZcsAeUc6cB3YD1IlsuRknM+dkywH7MGpJn2+audsb\nhk6dJGTLAfuQOU+fL8YsTmbLzTiROSdbDtgvqpnzQI5ZnMyWm3Eic062HLAfmfP0eN7M3ciWm7E7\nc062HLAfmfP0eN7M3ciWm7Ezc062HHAOG6G987yZu5UtN2PXSUK2HHAOmfPeeboB6ma23IxdmXOy\n5YCzopY5D9QGqJvZcjN2ZM6bmqQjR8iWA05i1NIzT5u5XzYMrZ4kZMsB591+u/GveDLn3fNszOJF\nttyMlcx5e7Z8+3aptNSZ+gAYfvQjacCAaGTOAzNm8SJbbsZK5vzvf5fy8mjkgBvInJvzpJl7mS03\ns3hxdplzv4yKgCgoLzcSY2TOu/KkmXuZLTczZow0fHhmmfMzZ8iWA25jI7R7njRzr7PlZjI9Sdqz\n5YMGOVURgKuROe+e68387Flp82bpnnvcPnLvqqulF180VtzpYMQCuG/IEKmy0og24zLXm7kfsuVm\nMsmc799vXGhUVeV8XQCuxKilK9ebud9Xs+meJGTLAe/MmEHm/Gqu5sz9lC03c/GikTlPJs0z52TL\nAe+FPXPu65y5n7LlZvr27T1zTrYc8B6Z8yu51sz9mC0309t9zv0+KgKigMz5lVxr5n7MlpvpKXNO\nthzwDzZCL3Otmfs1W27G7CQhWw74B5nzy1xp5n7Olpsxy5wzYgH8g8z5Za40cz9ny810lzknWw74\nD6MWgyvNPKir2atPErLlgP+QOTdYbub19fUaOXKkiouLtXr16m5/Z+9e48byQTN9unTokHGitLUZ\nCZeaGq+rAtBZTo4xO1+3zutKvGWpmbe1tWnZsmWqr6/Xvn37tGHDBjU1NXX5Pb9ny810zpyTLQf8\ni8y5xWa+a9cuFRUVqaCgQDk5OaqurtbmzZu7/F4QRyzt2jPnTzwR7P8OIMzInFts5i0tLcrPz+/4\nOi8vTy0tLV1+LwjZcjPtmfMtW8iWA34W9Y1QS808lmZoPCjZcjPLlhmxSrLlgH9FPXNuKZcxYsQI\nNTc3d3zd3NysvLy8Lr9XW1vb8XkikVAikbByWNfV1EiLFnldBYCedM6cL1nidTWZSyaTSlqYE1m6\na+LFixd100036aWXXtKNN96o8ePHa8OGDRo1atTlA2R45y8AyNbmzdIjjxi3Dwk6V++a2LdvX/3u\nd7/T9OnTVVpaqrvvvvuKRg4Abopy5tzV+5kDgNPCcp/zTHsnzRxAqLz1ljRrlnHBXx9P3rLeHr5+\ncwoAcFpUM+c0cwChE8XMOWMWAKFz4oRUXCwdOWK8KU4QMWYBEHlRvM85zRxAKEVt1MKYBUAoXbhg\n3Ol0506pqMjrajLHmAUAFL37nLMyBxBaQc6cszIHgM9EKXNOMwcQalHZCGXMAiDUgpo5Z8wCAJ1E\nJXNOMwcQelEYtTBmARB6QcycM2YBgKtEIXPOyhxAJAQtc87KHAC6EfbMOc0cQGTU1IR3I5QxC4DI\n+Pe/pZKSYGTOGbMAgImhQ6VEIpyZc5o5gEgJa+acMQuASGltNTLnr73m78w5YxYA6EG/fuHMnLMy\nBxA5jY3S7Nn+zpyzMgeAXsTj0qBB4cqc08wBRFLYNkIZswCIJL9nzhmzAEAawpY5p5kDiKwwjVoY\nswCILD9nzhmzAECawpQ5Z2UOINL8mjlnZQ4AGQhL5pxmDiDywrARypgFQOT5MXPu2pjl+eef1+jR\no3XNNddo9+7d2T4MAHguDJnzrJt5WVmZNm7cqClTpthZDwB4Iuijlqyb+ciRI1VSUmJnLQDgmRkz\npP37pQMHvK4kO2yAAoAuZ87r6ryuJDt9e/phVVWVjh8/3uX7K1eu1MyZM9M+SG1tbcfniURCiUQi\n7T8LAG5ZvNjInP/iF+5nzpPJpJIW8pGW0yyVlZV65JFH9LWvfa37A5BmARAg8bj06KPSLbd4W4cn\nFw3RrAGERVA3QrNemW/cuFE//OEPdfLkSQ0cOFAVFRXaunVr1wOwMgcQIH7JnGfaO7loCACuMmeO\nNGuWtGSJdzVwbxYAsCiIoxZW5gBwFT/c55yVOQBYFMT7nLMyB4BueH2fc1bmAGCDoN3nnGYOACaC\ntBHKmAUATHiZOWfMAgA2CdJ9zmnmANCDoIxaGLMAQA+8ypwzZgEAGwUlc87KHAB64UXmnJU5ANgs\nCJlzmjkApMHvG6GMWQAgDW5nzhmzAIAD/J45p5kDQJr8PGphzAIAaXIzc86YBQAc0q+fdM89/syc\nszIHgAy89Zbx/qBOZ85ZmQOAg8rLpcGD/Zc5p5kDQIb8uBHKmAUAMnTihFRc7GzmnDELADhsyBCp\nstJfmXOaOQBkwW+jFsYsAJCFCxeMzPnOnc5kzhmzAIALcnL8dZ9zVuYAkCUnM+eszAHAJX7KnNPM\nAcACv2yEMmYBAAucypwzZgEAF/klc04zBwCL/DBqYcwCABY5kTlnzAIALvND5jzrZv6Tn/xEo0aN\nUnl5uebOnav//Oc/dtYFAIGyeLFUVydduuTN8bNu5tOmTdPevXv11ltvqaSkRKtWrbKzLphI+iHQ\nGhI8l/aK+vPpdeY862ZeVVWlPp9d8jRhwgQdPXrUtqJgLup/YezEc2kvnk9vN0JtmZk/+eSTmjFj\nhh0PBQCBtWCBtGWL9PHH7h+7b08/rKqq0vHjx7t8f+XKlZo5c6Yk6Ve/+pX69eunBQsWOFMhAARE\ne+Z8+nTpi190+eApC5566qnUxIkTU+fPnzf9ncLCwpQkPvjggw8+MvgoLCzMqB9nnTOvr6/XihUr\n9Morr+iLrr8EAQA6y7qZFxcXq7W1VYMHD5YkfeMb39Dvf/97W4sDAKTH8StAAQDOc+wK0Pr6eo0c\nOVLFxcVavXq1U4eJjIKCAo0dO1YVFRUaP3681+UEzpIlS5Sbm6uysrKO73300UeqqqpSSUmJpk2b\npjNnznhYYbB093zW1tYqLy9PFRUVqqioUH19vYcVBkdzc7MqKys1evRojRkzRo8//rikzM9PR5p5\nW1ubli1bpvr6eu3bt08bNmxQU1OTE4eKjFgspmQyqYaGBu3atcvrcgLn3nvv7dJcHnroIVVVVemd\nd97R1KlT9dBDD3lUXfB093zGYjH9+Mc/VkNDgxoaGnTbbbd5VF2w5OTk6LHHHtPevXv1xhtvaO3a\ntWpqasr4/HSkme/atUtFRUUqKChQTk6OqqurtXnzZicOFSlMxLI3efJkDRo06IrvbdmyRTU1NZKk\nmpoabdq0yYvSAqm751PiHM3GsGHDFI/HJUn9+/fXqFGj1NLSkvH56Ugzb2lpUX5+fsfXeXl5amlp\nceJQkRGLxXTrrbdq3Lhx+uMf/+h1OaHw4YcfKjc3V5KUm5urDz/80OOKgu+3v/2tysvLtXTpUsZW\nWTh8+LAaGho0YcKEjM9PR5p5LBZz4mEjbefOnWpoaNDWrVu1du1avfrqq16XFCqxWIzz1qIf/OAH\nOnTokBobGzV8+HCtWLHC65IC5ezZs5o3b57WrFmjAQMGXPGzdM5PR5r5iBEj1Nzc3PF1c3Oz8vLy\nnDhUZAwfPlySNGTIEN1xxx3MzW2Qm5vbcYXzsWPHNHToUI8rCrahQ4d2NJ3vfve7nKMZuHDhgubN\nm6eFCxdqzpw5kjI/Px1p5uPGjdO7776rw4cPq7W1Vc8995xmzZrlxKEi4dy5c/rkk08kSf/973+1\nbdu2K1IEyM6sWbNUV1cnSaqrq+v4S4TsHDt2rOPzjRs3co6mKZVKaenSpSotLdXy5cs7vp/x+Znl\nlfy9evHFF1MlJSWpwsLC1MqVK506TCS89957qfLy8lR5eXlq9OjRPJ9ZqK6uTg0fPjyVk5OTysvL\nSz355JOpU6dOpaZOnZoqLi5OVVVVpU6fPu11mYFx9fP5xBNPpBYuXJgqKytLjR07NjV79uzU8ePH\nvS4zEF599dVULBZLlZeXp+LxeCoej6e2bt2a8fnJRUMAEAK8bRwAhADNHABCgGYOACFAMweAEKCZ\nA0AI0MwBIARo5gAQAjRzAAiB/wORIlzcjtj95wAAAABJRU5ErkJggg==\n", "text": [ "" ] } ], "prompt_number": 44 }, { "cell_type": "heading", "level": 2, "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "Using `np.cumsum()`" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Notice that each element in the $walk$ is simply a cumulative sum of the preceeding (and the current) steps. That is, letting $Step_t$ be the random step taken at time $t$, then:" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "$$\n", "\\begin{align}\n", "walk[t] & = & walk[t-1] + Step_t \\\\\n", " & = & walk[t-2] + Step_{t-1} + Step_t \\\\\n", " & \\ldots & \\\\\n", " & = & walk[0] + Step_1 + \\ldots + Step_{t-1} + Step_t\n", "\\end{align}\n", "$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let $walk[0] = Step_0 = 0$ for simplicity, then we define a $walk$ with cummulative sums of steps.\n", "\n", "Conveniently, NumPy ndarray provides a method, `cumsum()`. Let's take advantage of the method and simplify the simulation as so:" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The NumPy `randint(low, high)` returns an integer from low (inclusive) to high (exclusive)." ] }, { "cell_type": "code", "collapsed": false, "input": [ "np.random.seed(1234) \n", "T = range(21) \n", "\n", "steps = np.random.randint(0, 3, size=len(T)) - 1 \n", "steps[0] = 0\n", "walk = steps.cumsum()\n", "\n", "print walk\n", "plt.plot(T, walk)" ], "language": "python", "metadata": { "slideshow": { "slide_type": "slide" } }, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "[ 0 0 -1 -2 -3 -3 -3 -3 -2 -1 0 -1 -2 -1 0 1 0 -1 -2 -2 -3]\n" ] }, { "metadata": {}, "output_type": "pyout", "prompt_number": 45, "text": [ "[]" ] }, { "metadata": {}, "output_type": "display_data", "png": "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\nRrx2mSo89nQAAAAASUVORK5CYII=\n", "text": [ "" ] } ], "prompt_number": 45 }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "Notice that we are using a different random number generator. Even with the same random seed, we get a different sequence of random numbers." ] }, { "cell_type": "heading", "level": 2, "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "First Crossing Time" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Say we would like to know how long it took a longer random walk to get at least 10 steps away from the origin, 0, in either direction.\n", "\n", "NumPy `ndarray`'s `argmax`() function returns the first index of the maximum value. We are re-using the above code, but are setting the arguments so that we are simulating a longer walk." ] }, { "cell_type": "code", "collapsed": false, "input": [ "np.random.seed(1235)\n", "T = range(101)\n", "\n", "steps = np.random.randint(0, 3, size=len(T)) - 1\n", "steps[0] = 0\n", "walk = steps.cumsum()\n", "\n", "faraway = (np.abs(walk) >= 10) \n", "cross = faraway.argmax() \n", "\n", "print cross \n", "plt.plot(T, walk)\n", "plt.axhline(y = 10.0, ls='dashed')\n", "plt.axvline(x = cross, color='red')" ], "language": "python", "metadata": { "slideshow": { "slide_type": "slide" } }, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "63\n" ] }, { "metadata": {}, "output_type": "pyout", "prompt_number": 46, "text": [ "" ] }, { "metadata": {}, "output_type": "display_data", "png": "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\nVBIIdPwAAAAASUVORK5CYII=\n", "text": [ "" ] } ], "prompt_number": 46 }, { "cell_type": "heading", "level": 2, "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "Simulating Many Random Walks at Once" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Usually we would like to simulate repeatedly.\n", "\n", "In our context, this means generating multiple walks. NumPy `ndarray` can have multiple axes or dimensions. We just introduce the second axis representing the repetition." ] }, { "cell_type": "code", "collapsed": false, "input": [ "np.random.seed(1235) \n", "T = xrange(1000)\n", "num_walks = 5000 \n", "\n", "steps = np.random.randint(0, 3, size=(num_walks, len(T))) - 1\n", "steps[:, 0] = 0\n", "walks = steps.cumsum(1)\n", "\n", "import time\n", "from IPython.display import display, clear_output \n", "\n", "f, ax = plt.subplots()\n", "for i in xrange(0, num_walks, 160): \n", " time.sleep(0.2)\n", " ax.plot(T, walks[i, :], color='darkgrey')\n", " clear_output(wait=True)\n", " display(f)\n", "plt.close()" ], "language": "python", "metadata": { "slideshow": { "slide_type": "slide" } }, "outputs": [ { "metadata": {}, "output_type": "display_data", "png": "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\nMBhblP8HDEOmGiLFdzUAAAAASUVORK5CYII=\n", "text": [ "" ] } ], "prompt_number": 47 }, { "cell_type": "heading", "level": 2, "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "Quiz. " ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "-" } }, "source": [ "Simulate 5,000 random walks, each of which runs from the position of 0 at $t == 0$ to $t == 700$. For each walk, find out the \"crossing time\" to +30 or -30, that is the first time when the position reaches either +30 or -30. Calculate the mean crossing time over all 3,000 random walks. Notice that not all the walks may reach $\\pm 30$. In that case, use only those walks that ever reach $\\pm 30$ within the given time $t <= 700$. Make sure to use a random seed so that the simulation can be replicated exactly." ] }, { "cell_type": "code", "collapsed": false, "input": [ "# an answer\n", "%matplotlib inline\n", "import matplotlib.pyplot as plt\n", "import numpy as np\n", "\n", "np.random.seed(123)\n", "T = xrange(700)\n", "num_walks = 5000 \n", "\n", "steps = np.random.randint(0, 3, size=(num_walks, len(T))) - 1\n", "steps[:, 0] = 0\n", "walks = steps.cumsum(1)\n", "\n", "# filter, get crossing times, and print the mean crossing time\n", "hits30 = (np.abs(walks) >= 30).any(1)\n", "xtimes = (np.abs(walks[hits30]) >= 30).argmax(1)\n", "print \"mean crossing time (for walks that reach +30 or -30): \", xtimes.mean()" ], "language": "python", "metadata": { "slideshow": { "slide_type": "skip" } }, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "mean crossing time (for walks that reach +30 or -30): 443.027027027\n" ] } ], "prompt_number": 48 }, { "cell_type": "heading", "level": 2, "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "References and Resources" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "* Bressert, Eli (2012) *SciPy and NumPy: An Overview for Developers* O'Reilly. ISBN:149305466. at [Amazon](http://www.amazon.com/SciPy-NumPy-An-Overview-Developers/dp/1449305466)\n", "* McKinney, Wes (2012) Chapter 4. \"NumPy Basics: Arrays and Vectorized Computation\" in *Python for Data Analysis:Data Wrangling with Pandas, NumPy, and IPython* O'Reilly. ISBN:1449319793. at [Amazon](http://www.amazon.com/Python-Data-Analysis-Wrangling-IPython/dp/1449319793)\n", "* NumPy Reference at [NumPy site](http://docs.scipy.org/doc/numpy/reference/)\n", "* NumPy User Guide at [NumPy site](http://docs.scipy.org/doc/numpy/user/)\n", "* Tentative Tutorial at [SciPy site](http://wiki.scipy.org/Tentative_NumPy_Tutorial)" ] } ], "metadata": {} } ] }