{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": false }, "outputs": [], "source": [ "'''\n", "The core data type in Numpy is the ndarray, which enables fast and space-efficient multidimensional array processing.\n", "Note: This notebook is adapted from chapter 4 Python for Data Analysis by Wes McKinney and O'Reilly publishing. NumPy has many, \n", "many features that won't be covered here. The following snippets are just to illustrate basic data types and operations within\n", "numpy.\n", "\n", "Another good resource for learning more about ndarrays is here:\n", "http://docs.scipy.org/doc/numpy/reference/arrays.html\n", "'''\n", "\n", "#First, import NumPy\n", "import numpy as np\n", "\n", "#It is easy to create Nx1 and NxM arrays from standard Python lists\n", "l1 = [0,1,2]\n", "l2 = [3,4,5]\n", "\n", "nd1 = np.array(l1)\n", "nd2 = np.array([l1, l2])" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "The ndarray has dimension n=3 and m=1\n", "The ndarray has elements of type=int64\n", "The ndarray has dimension n=2 and m=3\n", "The ndarray has elements of type=int64\n" ] } ], "source": [ "#Now, we can get ask for some basic info to describe the ndarray\n", "def desc_ndarray(nd):\n", " try:\n", " print(\"The ndarray has dimension n=%s and m=%s\" % (nd.shape[0],nd.shape[1]))\n", " except:\n", " print(\"The ndarray has dimension n=%s and m=1\" % nd.shape[0])\n", " print(\"The ndarray has elements of type=%s\" % nd.dtype)\n", "\n", "desc_ndarray(nd1)\n", "\n", "desc_ndarray(nd2)\n", "\n" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "[array([0., 0., 0., 0.]),\n", " array([1., 1., 1., 1.]),\n", " array([ 0.0030948 , -0.26996601, -1.24398329, -1.70177842])]" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "#There are short cuts for creating certain frequently used special ndarrays, i.e.,\n", "\n", "k=4\n", "\n", "#1. an ndarray of all zeros\n", "zero = np.zeros(k)\n", "\n", "#2. an ndarray of all ones\n", "one = np.ones(k)\n", "\n", "#3. an ndarray of random elements (this one is standard normal, but there are many distributions to choose from)\n", "rand = np.random.randn(k)\n", "\n", "[zero, one, rand]" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "[array([[-0.20207034, 1.61682753],\n", " [ 0.71984551, 0.21305453],\n", " [-0.23224371, -0.08503735],\n", " [ 0.24525545, -1.29060416]]),\n", " array([0.71984551, 0.21305453]),\n", " 0.21305453473586158]" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "'''\n", "For indexing an array:\n", "1. If nx1 array, follow the same protocol as a regular Python list\n", "2. If nxm array use the following examples\n", "'''\n", "\n", "arr2d = np.random.randn(4,2)\n", "\n", "#A single index gets a full row\n", "\n", "#2 indexes returns a value\n", "[arr2d, arr2d[1], arr2d[1,1]]" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "[array([-1.59629167, -0.21458685, 0.82521036, 0.32745471]),\n", " array([-3.19258334, -0.4291737 , 1.65042072, 0.65490941]),\n", " array([-3.19258334, -0.4291737 , 1.65042072, 0.65490941]),\n", " array([-0., -0., 0., 0.])]" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "'''\n", "Operations between Arrays and Scalars\n", "An important feature of ndarrays is they allow batch operations on data without writing any for loops. \n", "This is called vectorization.\n", "Any arithmetic operations between equal-size arrays applies the operation elementwise. \n", "'''\n", "\n", "#examples\n", "\n", "k = 4\n", "rand = np.random.randn(k)\n", "[rand, rand + rand, 2*rand, rand*np.zeros(4)]\n", "\n" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "[array([ 1.72621442, -0.89294325, 0.58183986]),\n", " array([-0.62763554, 0.69813715, -1.86053985]),\n", " array([ 1.09857888, -0.19480611, -1.27869999])]" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "'''\n", "Matrix operations\n", "It is easy to do matrix operations with Nd arrays. The standard arithmetic operators don't work here though. And it is important \n", "to make sure matrix shapes are compatible\n", "'''\n", "\n", "k = 3\n", "r1 = np.random.randn(k)\n", "r2 = np.random.randn(k)\n", "\n", "#Matrix addition is the standard matrix operator\n", "[r1, r2 , r1 + r2]\n" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "[array([[ 1.72621442, -0.89294325, 0.58183986],\n", " [-0.62763554, 0.69813715, -1.86053985]]),\n", " array([[ 1.72621442, -0.62763554],\n", " [-0.89294325, 0.69813715],\n", " [ 0.58183986, -1.86053985]])]" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "#The Transpose can be taken with the attribute T\n", "arr2d = np.array([r1, r2])\n", "[arr2d, arr2d.T]" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "[array([[ 1.72621442, -0.89294325, 0.58183986],\n", " [-0.62763554, 0.69813715, -1.86053985]]),\n", " array([[2.97981623, 0.79734765, 0.33853762],\n", " [0.39392637, 0.48739547, 3.46160852]]),\n", " array([[ 4.1157015 , -2.78936661],\n", " [-2.78936661, 4.34293036]])]" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "'''\n", "Matrix multiplication, like inner products can be done on arrays.\n", "Just remember that the standard multiplication operator does elementwise multiplication (provided they are the same shape).\n", "We need the dot method in order to do an inner product\n", "\n", "Numpy has a linalg library that can run most matrix operations on ndarrays:\n", "http://docs.scipy.org/doc/numpy/reference/routines.linalg.html\n", "\n", "One can also create a matrix object and use the methods in numpy.matrix to achieve the same thing:\n", "http://docs.scipy.org/doc/numpy/reference/generated/numpy.matrix.html\n", "'''\n", "\n", "[arr2d, arr2d * arr2d, arr2d.dot(arr2d.T)]" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "10000 loops, best of 3: 180 µs per loop\n" ] } ], "source": [ "'''\n", "One important feature of vectorization is that it allows elementwise processing that is much faster than writing a traditional\n", "loop.\n", "'''\n", "import math\n", "\n", "#show an example and profile i\n", "%timeit [math.sqrt(x) for x in range(1000)]" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "The slowest run took 14.61 times longer than the fastest. This could mean that an intermediate result is being cached.\n", "100000 loops, best of 3: 6.38 µs per loop\n" ] } ], "source": [ "%timeit np.sqrt(np.arange(1000))" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": 11, "metadata": { "collapsed": true }, "outputs": [], "source": [ "'''\n", "The last thing we'll cover in this module is the numpy.random library. In general, it is advised to use numpy for\n", "random number generation as opposed to python's built in random module.\n", "\n", "Random number generation has many uses. One common use is generating fake (i.e. random) data to test modeling procedures\n", "or to do Monte Carlo Simulations\n", "'''\n", "import matplotlib.pyplot as plt\n", "%matplotlib inline\n" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "collapsed": true }, "outputs": [], "source": [ "\n", "\n", "#Generate random pairs that have a multivariate normal distribution\n", "N = 1000\n", "mu = np.array([0,0])\n", "cov = 0.5\n", "sig = np.array([[1, cov],[cov, 1]]) #Must be square, symmetric and non-negative definite" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "collapsed": true }, "outputs": [], "source": [ "x, y = np.random.multivariate_normal(mu, sig, N).T" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\npOi3IwxqigAAAABJRU5ErkJggg==\n", "text/plain": [ "<Figure size 600x400 with 1 Axes>" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "\n", "#Now let's plot and see what that looks like\n", "\n", "\n", "plt.plot(x, y,'.') \n", "plt.axis('equal') \n", "plt.show()\n", "\n" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXwAAAD8CAYAAAB0IB+mAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4zLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvIxREBQAAIABJREFUeJzt3Xl4G9XV+PHvlWzLsS3bsS07zuqQ\nPSGQQAgJy8sWtgANlC5AWVtKaYG2b/u2v7Bvhe4tpUDblFJK2UpbWpawBtImEAhkIfvm7LvlLN4t\nW9b9/TEaebTYli3ZsqTzeZ48SDMjzZ2InLlz5s65SmuNEEKI1GdLdAOEEEL0DQn4QgiRJiTgCyFE\nmpCAL4QQaUICvhBCpAkJ+EIIkSYk4AshRJqQgC+EEGlCAr4QQqSJjEQ3wKqkpERXVFQkuhlCCJFU\nli9fXq21dnW1Xb8K+BUVFSxbtizRzRBCiKSilNoZzXaS0hFCiDQhAV8IIdKEBHwhhEgTEvCFECJN\nSMAXQog0IQFfCCHShAR8IYRIE/1qHH5fWLD+IK1tPgYXDuD4YYWJbk6PbHXXs/lAHR6vj0unDkl0\nc4QQSSKtAn6bT3PjM+0Pdu34yUUJbE3PnfPL/wZeTxqcz5gyZwJbI4RIFmmV0jnU4El0E+Kutrk1\n0U0QQiSJlAn43jYfuw41AuDzaVbuOsKRhpagbdbtrQ16nwrB0l1nHGNrm4/dhxsT3BohRH+WMgH/\nJ29u5H9+vpCqumYeX1jJZU8sYeqD7wZtc8PTnwa9n/Hwe33ZxF7hrjeuWh54bT2n/2whRxtbuviE\nECJdpUzAf39jFQDuOg+LK6vD1vt8OmxZY0tbr7cr3jze4Da764yAv2DDwaD3QggRKmUCvulQfQuE\nx3aOpEjPt7o++DhCA7zZ4xdCiFApN0rn2qc+CXrv8bbhyLAz48eR0zcPv7GBO2ZPCFvu82mOueON\nwPvnbzyZU0aXxLexPRAW4Os8LNxYxf6a5ojrhRDClHI9/FBmj7i1zej2f/PMUTx21VTGDzKGMs5b\ntC3i50KvCF74dHcvtjJ6ZkD/3rljmViej7vew9NLdoStF0KIUCkT8BtavEHvc7LsgBEAtW7P8Xx5\n2jAuPm4wn5syuNPvC02NqDi1M1ZmQP/StGFMKM+nus6DsjROUjpCiI6kRMD3+XRYbnvS4HzACJC1\nTe0nA5fTAUCWvf3Qpz+0gJv/upz9NU08t3Qntz6/ggseWRz0fa+u2sc3n13Omj01vXUYXWpubeOO\nf60BoDgvC5fTgbvOQ5vlhvQf/rtNevlCiIhSIuAfaWyhzac5piQ3sGxCeXvAd9cb+e2K4hxyHcZt\niyunDw9sW1Xn4a11B/jF25u5819reX31/oj7eXPtAb76l08jrusLH207FHidabfhcjpoafNR1xx8\ndfP7/27t66YJIZJASgR8M43xf+eP49qZIwAYNjDHWFfnocrf4/3x548LfCbXkcGlIWkda+qnI5GG\nd/aVtrbgfZtXKxv213LO+NLAcl8UxyGESD+pEfD9Ad0MgAAZdoUzO4NfL9jMvqPNYesjWbM3unTN\na6v2MefxD/lgS/h4/2i8tGw31T3Itc9bHHyD2ZVnHI/H6ws6ttV7algS4VkEIUR66/WAr5S6QCm1\nSSlVqZSa2xv7qG/2kpVhw5Xn4Mrpw8my25g1oSyQ6vjF25uA8IB/w6kjg95vqaoP+26nI4Nvnz06\naNltL6xk1e6jXP2npd1u654jjfzwH6u57fmV3fpcVW0zn2w/DMA1M4yrGOvxlOQ5ePDSYwFYvvMI\nVz3Z/bYJIVJbr47DV0rZgceBc4E9wKdKqVe11uvjuZ8LJ5dzwbGDzH2y+aELg9YfqG0mK8NGfnbw\n4R4/rJBtD88OGm9vOn1MCX/92smB94++XwnE/nTu0Uajfs+eo92re3PIUhfIDOzWgJ/jsHPNjBG8\n9OnuqK9UhBDppbd7+NOBSq31Nq11C/AiMKc3dqSUQqmOB0+68hwR19ts3Rtw2dQaHPBDSx10xeyl\nd0dtcysrdh0JWx56AoPgk0B32yaESG29HfCHANYnlvb4lwUopW5SSi1TSi1zu91x3fmF/l4/dJ2/\nDzVrQlnQ+7FleRG3Cx0O2pk2n+aB17t/cfOl33/Enf9aG7bcegKbOmwgAIU5mYFlh7rRNiFE6kv4\nTVut9Tyt9TSt9TSXyxXX7370yqmU+G9sdhbw191/PlfPMIZp3njaSJbfNSsw2sf06q2n8fBlkwPv\nvzxtGGDk1qN12JKW6c5Amo0H6gKvl901K2jdmvvOY8ncs5k5qhgAm+UkUCXj8YUQFr0d8PcCwyzv\nh/qX9YlMu43RpcbY/M4Cfq4jg+wM48nc4jwHxRHSP9mZdkZaxvmfN8m4AujOQ07WbUPHzkfLPIGZ\nnNmZDC4c0OX+hBCitwP+p8AYpdRIpVQWcAXwai/vM4jLmW38N6/zlM6wImPcfnlBdiffZXyHTcE4\nfy2ezkoZPPDaeirmzuf+19aFbVvT1BqWY/9o6yGmPvBOoKb9l//wEWf/8j+dtjtURXFO4LUEfCGE\nVa8GfK21F7gVeBvYALyktV7Xm/sM5YoipQNw9YwR/P7qE5nTSY0d8zuKch2U+k8knQXVpz7cDsCf\nP9wRtO3pY4yqm6H5/7V7azjS2MoO/8xdS7cfZpu7odN2h7r5jFE8ftUJXbZNCJF+ej2Hr7V+Q2s9\nVms9Smv9UG/vL5QZpLsK+Hab4oJjB3U60ic/O8MY7+90kJVhY2BOZo9SOl/05/87qmUfS6DOsNu4\n6Lhyo2310d9fEEKkvpSrhx+qNMqAHw2lFKVOR9BJxBqcP9hSzR8WbWXxlmqmDi8M+uynOw7jrvOQ\nm2UPpF0i1bY3/xuphEN3RpCGtk0IIVI+4J81vpQbTxvJsYML4vJ93501lpK8LABKndlBeXnrk7cr\ndx0N+twNf/6Us8aX4nK2p4Oq6oJ74NaAX9MUPMH6GWNd/OD8cVG3s9SZLQFfCBEk5QN+UW4Wd108\nMW7f94UThwZeu5wOduyILsfe2ubDXdeMy+mg2H/C6LCHX98cdjP4rosmMKbMGXU7XU4Hy3Z2L/8v\nhEhtCR+Hn8xcTgd7jjRxy/MraPH6Ot3W4/XhrvPgcjrItNsoys0KBPj3NhzkjJ8vZNNBY7z9sx/v\nCtT/se6ru23bfbgpUL+/tc3Hd15cyT+X7+nW9wghUocE/BiYI4Dmr97Psx/vjLiN+bBWeYGRYgmM\nGsprz7F/7S/L2HkouLbOO+sPBr0vGJBJd5j7ueSxDwD498q9vPLZPr7/91Xd+h4hROpI+ZRObyrK\nzQq8jvQg1ciSXK46eTir9xzljTX7qW32Bt/wjaJE8pr7zsOZ3b1gH9o2gHpPe/vMid2FEOlFevgx\nyLC3D5t5eWXHqRKX00Gt/4QQOsKnubXzAmd5jp6dk61tA4KmQexO/R8hROqQgB8DcxpFICglM2WY\nMSTz8hOMOnHW/HtowA+9cXvq6OKg9509FxBt2yC4vLKM3hEiPUlKJwZjy5x8ds+5THng3cCy3199\nIudMKMXj9ZGbZaRNrGUdXHntpR48Xh/bq42RNL/44vHMmlBKfnYmn+05yuefWBJz2245axSPL9xK\nY4s3KMh3p+CbECJ1SA8/RoU5wbnyYUUDyLTbyHNkBHrnBZaSxaFP/pqTlYwf5KQwJwubTTGuG8Mv\nOzOyxCjpXFXr4WBtM2X5xj6t9w58Pp3QeXqFEH1HevhxVpwbPnzSWuHSHINvBvyfR5h+Mdeftx/S\nQRXMaJnfeeYv/gPAiSMGcrA2OI104W8WU+/x8uHcs2PalxCi/5OAHwcf3X4281fv5xhXLoMiVNsc\nW+bk91efQGFOFpl246IqdFx96Kia1249jfLCjit3RiO0Qqjy78ca8M2x/0KI1CcBPw7KCwZw4+nH\ndLrNBceWB70PDcbmicA0eWjspSBCTyo2mwoa/y+ESC+Sw08Q61SEvSX0qqFgQGZg/P9NzyyjYu78\nwLrfvrcFgAaPl2v+tJSt7vpeb58Qom9JwE8QpRQ/vGAcGTbFE185oVf2Ybcpzh5fGnj/8GWTA8NB\nQ5/k/eW7mwEjxbN4SzUfbzvUK20SQiSOpHQS6FtnjuZbZ47u1X1879yxvL+xioE5mf5KnQ6qajtO\n6VgrdgohUosE/BRnjgoyuZwOWtoiF3qbdM9bgXsHEvCFSD0S8FOcK8/B9JFF3HKWcSXRWdXNhpY2\nPt52GJCAL0QqkoCf4jLsNl76xszAe+vooFduOZXjhxXyzEc7uOeV4KmGoynsJoRILnLTNs1EqusT\nqVqP9PCFSD0S8NOMNeCb+f0TRxSFbeeu86C1lFwQIpVIwE8zBQMyybQrCnMyAzXxJw7OZ+ODFzDv\nmhMD23m8Puo84TX+hRDJSwJ+mlHKeNo29Enf7Ew7QwfmBC3rbPhmqObWNrTWNLWE1/dvammjwePt\nsva/EKJ3xRTwlVJfVEqtU0r5lFLTQtbdrpSqVEptUkqdH1szRTwNGTiAIQPDC7OV+FM85f56QNHm\n8Zta2pj+0ALufXUdE+55i0Wb3YF1f1+2mwn3vMWke99m/N1vSZpIiASKdZTOWuDzwB+sC5VSE4Er\ngEnAYGCBUmqs1lq6eP3Ar740BZst/FZtaX42/77lVOxKccljH0Q9Umd/TRO1zV6e+ciY13fRZjf/\nM9YFwKur9gVtW9vs7fb8vEKI+Igp4GutN0DEWZnmAC9qrT3AdqVUJTAd+CiW/Yn4GFaU0+G6KcMK\nOdpozI4VbQ+/OyN63HUeCfhCJEhv5fCHALst7/f4l4kkYN7Y7SqQ/+TNjcxbtDXsSuDJD7ZzqIOr\ngy/+PraZvIQQPddlwFdKLVBKrY3wZ048GqCUukkptUwptcztdnf9AdHrzBu7XQX8+Wv28c66gxG3\ne29jFRA8eTrAkcbW+DVUCNEtXaZ0tNazevC9e4FhlvdD/csiff88YB7AtGnT5I5eP2GWUe6I1hp3\nnQeb6uBKwP9LHrZMnm5q8HgDs3oJIfpOb6V0XgWuUEo5lFIjgTHAJ720L9ELzDLKr67ax382VYWt\nr/d4aW714a7zRAz4D7y+Hp9PR1wnT/EKkRixDsu8TCm1B5gJzFdKvQ2gtV4HvASsB94CbpEROsnF\n5czGXefhkXc3M2/RtrD1ZtBubGlj56HGsPX1Hi9r9tZwuLEFR4aNH5w/jqH+oaBSp0eIxIgp4Gut\n/6W1Hqq1dmity7TW51vWPaS1HqW1Hqe1fjP2poq+5HI6ONTg4UBtM9URArS1l75+fy3mKM+bzxgV\nWL7rcCNaw90XT+SWs0bzx2unhX1WCNF35ElbEZHL6UBrowcfKUDPX7M/8Lre4+UYV17gc6YN+2uD\nlpn/lYAvRGJIwBcRWUsvHGlspcXbPmlKU0tb4CEr00kVReQ5Mpg0OJ8RxcY4//UhAX9gThZ2W9fD\nPYUQvUMCvogodKKUQw3tQTpSwK4ozmHt/ecz45hi3v/+mdhtivX7/AHff/Kw2xTFuVkS8IVIEBkb\nJyIqDQn4290NaG08lLV2X03Y9taHrc3AXuUP7KE1+K03bX0+jbveE1S9UwjROyTgi4hKQqppXvXk\n0k63P6YkL+i99UZvdmZ7IDeHe5oeeW8Lj763hbJ8B0vv6MkjH0KIaEnAFxENyLLjdGR0WhP/lVtO\npTAnk52HGgPF0ky+Dh6hc+U52Li/LvD+n8v3AHCwG6WYhRA9IwFfdMjldGCzKWqaIpdDOHZIAXab\nYkRxbre+s7reg8+nsdkUrW2+rj8khIgLuWkrOuRyOhhcGF4332SPUGLZVFEcuSKny+nA69Mc9Z9E\nGi0TpjS1tFExdz4Vc+eH1eARQsROAr7o0A/OH8ddF02IuO6Jr5zQ6WefvfFkLpg0iDe+fXrQ8tCx\n+NZSzev3t98M7qjaphCi5yTgiw5Nqyji1NElgfc/vXwyAGeNczF7cnmnnx06MIffX3MiEwfnBy03\nh2iaAb+63kOW3fjfsLKqPrCdlF8QIv4k4IuoFQwwpkCMMOFN1Mwe/p3/XsPCjVW46zyBk8L/++ea\nwHbxGKtf09TKva+spbFFJmMXAiTgiyj88dppfOOMYzhjrIvZkwdx7yUTe/xdpfnGfLk7DzVyw9Of\nAjAp5CoA4hPwl1RW85ePdrJi59GYv0uIVCCjdESXzp1YxrkTywB44isnxvRduVnhD1eNL48Q8OOQ\n0jG/w13fHPN3CZEKpIcv+lSkdFDoU71ORwbLdxxh8RY372042ON9mVcJUspBCIP08EWfy7LbaLGM\nvz9uaEHQepfTwXsbqwLTJC6Ze3anw0M7IgFfiGDSwxd97tM720so3HvJRMoLBvD6bacFlpWE9Pgj\nTZMYDQn4QgSTgC/6XP6AjMBQTHPUTmlIgTUra12emsZWmlqimzytPYcvAV8IkIAvEkAp1T4pin9c\nflGuMeTz3IllQbX4IbiHfvWflvLwGxui2o/08IUIJgFfJERJyCxYGXYbi35wFr+9ciq5juCRPNYe\n+jZ3Pduq6+mKz6cDVwZVEvCFACTgiwQxe/HW9M3w4hyyM+0ogkfyVPkraTZ4vDS0tAXed6amqZXW\nNk1RbhZHG1vxeKNLAwmRyiTgi4Qoy3cwINNOniN8oJiZ3jE9vWQHa/bUtKdoosjJm736if4x/ofq\ne3bjV4hUIsMyRUJ8/fRjOGtcacRx+dfMHEFWho1ch53//dsqAF78dBeXTh0CEOixdzZDlnlymDg4\nnw8qq3HXeXo0tFOIVCI9fJEQFSW5zPI/vRsq027j6hkjuGzq0KDl1puvXfXYzadrzR6+3LgVQnr4\nIklogoO2u87D+xurKMrNili509rDBxmaKQTE2MNXSv1cKbVRKbVaKfUvpVShZd3tSqlKpdQmpdT5\nsTdVpKN/3DwTMG7Yhgb8u/69lm89tyLi59x1HrIzbYzwT8QiPXwhYk/pvAscq7U+DtgM3A6glJoI\nXAFMAi4AnlBKdZxwFaID0yqKOHHEQNx1Htx1nsAsW1312N11HlxOB44MO4U5mRLwhSDGgK+1fkdr\nbRYb/xgwk65zgBe11h6t9XagEpgey75E+ip1Oliy9RB/W7abUS5j/tw31uwPrP/H8j34QqZEdNd7\n2od+5jlw13lYvMXN7sONfddwIfqZeN60/Srwpv/1EGC3Zd0e/7IwSqmblFLLlFLL3G53HJsjUkVh\nTmbg9ZHGVgbmZLJ4S3Vg2f/9fRWvrd4X9Bl3nYdSp1F7vzTfgbvewzefXcHv/7u1bxotRD/UZcBX\nSi1QSq2N8GeOZZs7AS/wXHcboLWep7WeprWe5nK5uvtxkQasQzezM21htXYgvMCamdIBo4e/o7qB\neo+Xg1E8tCVEqupylI7WelZn65VS1wMXA+dorc3r6r3AMMtmQ/3LhIhJhs0I+JsPBpdXaLOkdFq8\nPo40trYHfKeDQ/4TgozWEeks1lE6FwA/BD6ntbYmR18FrlBKOZRSI4ExwCex7Eukr5MqBgZez5pQ\nitORGbbNkcb2Hv6hBiOou5zh5Ruq5eatSGOxjsN/DHAA7/ovuz/WWt+stV6nlHoJWI+R6rlFay3F\nTESPXDplCGPLnGgN4wc5ue2FlQB8edow/rbMuFUUOmQTItfrcdd50FrHNBG7EMkqpoCvtR7dybqH\ngIdi+X4hwMjhTxpcELZ8xqiizgN+IIefHVjX0uajtslLQU74VYIQqU5KK4ikM3SgUROnxFI338zN\ne9t8fO0vy4DIKR1jW5nUXKQnCfgi6Xz/vHH8+svHc9roEp7/+snMOKYoUDLZOlqnOM+ouhka8KMp\nryxEKpKAL5JOdqady6YORSnFKaNKmDaiiEMNLbT5dNBkJ2Y1zcIBmWTYFDlZxnsZqSPSlQR8kfRc\nTgdtPs31f/6E77+0Kmy9zaYoyXMwwV85c+ehRr79wkoO1EhqR6QXqZYpkp6ZsrE+fXvrWcHjCb55\n5ijKC7K59YWVPPPRDqrrW8i02/jll47vy6YKkVAS8EXSi/Tk7S0hAf+6UyqMbfMc7D3aBIBP69CP\nCZHSJKUjkt7AnKywZQOyIhdnjXRyECJdSMAXSc8cphmNmqbWwOvWNl9vNEeIfksCvkh62Zl2Hr1y\nalTbOjLa/5eXic1FupGAL1KCNZB3xlpSYfmuI+w+3Mj7Gw/yYWU19R5vYF1NYytLtlbj8UpFEJE6\n5KatSAnmxCgAZ4ztuMz2BZMGsWF/LWBU1Tz9ZwsD6yaW5/PGd04H4KSHFtDS5uMLJw7lF1+UkTwi\nNUjAFylhdKmTT+44h0y7jRxHx7Np3nb2aD43ZTBPLt7Gc0t3Ba1b7z8RgFFzB2DhxqreabAQCSAB\nX6SM0vzsLrex2RQjS3IDT912pbFFUjoidUgOX6SlIYXRjexpam0Lmj/XtGD9QU758Xs0yQlBJBEJ\n+CItXTOzIvB6RHEOAFl2G1prGlu8Qds+89GOsM+v3nOUfTXN7Ktp6sVWChFfEvBFWrLbFKePKQHg\n7osmcufsCbS0+ajzeKmu63q4plmkzS0zaIkkIgFfpK3cLOMWVmZG+8To7joPc19eHbRda1t4CQa3\nBHyRhCTgi7T1wJxJfO20kZwyqjgo4C/ZegiAx686AYDszPB/JmaJZQn4IplIwBdpqzQ/m7svnkim\nvb2Hv/dIe07+pJEDOXdiWcQUT6CHL7X1RRKRgC8E7ROeb7CMxS/OdeByOsKCus+nqZYevkhCEvCF\nAAoGZJJpV0EPX9ltCleeg8MNLUGF1mqaWgN5fQn4IplIwBeC9lmxzID/6q2nAlCab/T8rYXWrD1+\nCfgimciTtkL4lTodrNpT439tPLVrpnrcdR58WrNhfy17/Hn+iuIcyeGLpBJTwFdKPQjMAXxAFXC9\n1nqfMkoS/gaYDTT6l6+ItbFC9KYWy/DL4jxjUpXA6J36Zi557IOg7ScNLuDNtftp82nsNoUQ/V2s\nKZ2fa62P01pPAV4H7vEvvxAY4/9zE/C7GPcjRK+zhuxMu/FPwzpcM9TEwfn4NBxukLr6IjnEFPC1\n1rWWt7mA2UWaAzyjDR8DhUqp8lj2JURvi9RLL/GndA7Whgf8kSVGSWbJ44tkEfNNW6XUQ0qp3cBX\naO/hDwF2Wzbb418mRL81sTw/bFl2pp387Awqq+rD1pUG0j0S8EVy6DKHr5RaAAyKsOpOrfUrWus7\ngTuVUrcDtwL3dqcBSqmbMNI+DB8+vDsfFSKu7p8ziQnlTs4cVxq03OV0sG5fTdCy31wxJXBjV3r4\nIll0GfC11rOi/K7ngDcwAv5eYJhl3VD/skjfPw+YBzBt2rTwoiVC9JHsTDvXnzoybLnL6eCT7YeD\nlv3PGBcOf8kFCfgiWcSU0lFKjbG8nQNs9L9+FbhWGWYANVrr8KLiQiQBlzMbX0hXpGBAJjlZGeQ5\nMqiqawbggdfW8+InuyJ8gxD9Q6zj8H+ilBqHMSxzJ3Czf/kbGEMyKzGGZd4Q436ESBhzLD7A8zee\nzFZ3PTb/DV6X0xHo4T/14XYArpguqUnRP8UU8LXWl3ewXAO3xPLdQvQX5tBMR4aNmaOKOWV0Sfu6\nPCPgt3h9HX1ciH5DSisI0QUz4LucDoxnCoPXLd1+mF+8sykRTROiWyTgC9EFa8AP5cw2LpLnLdoW\nWOYLTfgL0U9IwBeiC2YO35rLN6kIFRWONrX2dpOE6BEJ+EJ0wayYaf63KzJMU0SyavdR3t94MKFt\nkIAvRBcG5mThcjoYNyj8SdxZE8rClknAF6HafJo5j3/IV59eFjTJTl+TgC9EF+w2xeIfnsVXIgy3\nPGdCWaAkw3fOMR5Lcdc392n7RP93pLG9wF51AktxSMAXIgrZmfbA2PvwdcY/o2OHFADSww+ltaax\nxUtbH93M1lr3m2Gy3jYfrW0+dh5qDCyrbfImrD0S8IWI0XFDCwFjQpTsTJsE/BA/e3sTE+95m2uf\nWton+3vls32c/PACmlvb+mR/nTn/kUWMufNNLv/dksAyd13irgBlxishYnTH7AlcdFw5Y8qcQU/e\nCsOfFhtPIH9YeahP9rfhQC1HGlupqvUwvDinT/bZka3uhrBliayuKj18IWKUlWHjpIoiwP/krZRL\nDtLS1rfpFfOE2x/vpTizMxLaIZCAL0QcmT38u/69hsfe39Ltzx9uaOG8X/+Xyqq6Xmhd8rv1+RU8\n+/HOTrcJBPwEBdb/bKqiYu58fvefrWHrinOzeGnZHtburYnwyd4nAV+IODID/rMf7+IX72zu9uff\nXX+AzQfreSJCsEhWw4va0yqx3LjVWvP66v3c9e+1nW6X6ID/7RdWAvDTtzYGLX9wziR2+G/e/jJB\npTgk4AsRR668bI409vxJW52CVRkON7SQ4R/hFMv8v/We6Ea3mIG+KkEB3xvhpHb8sEKumVlBwYDM\nBLSonQR8IeIotN7Oil1Hov7swk1VzH15Tbyb1Kee+WgHjy+s5N31xhOljS1e6j1eJg42nlWw9rp/\n/MYGbv7rcq576hNm/vi9LtMc1s9uOlDHun01XPDIItbsaf9ca5uPw/4x7799v5KGKE8S8dTY0vHo\nIHPe5IWb3Pz1ox190yALCfhCxFFowP/8E0s62DLcDX/+NPDa00/GkXeHt83HPa+s4+dvb+LrzywD\noLrOCL7mw2nmDe2mljb+sGgbb607wH83u9lf08zFv/2g0++3BvzLnviQix79gI0H6rjksfbPHW5o\nCbpK+uPibfQ1awoLYEjhAH4051gAHr/qhMDyu19Z16ftAhmWKURcRaqo2RPVSTi081CEdI05Uia0\nh9+T/Lp19FNHvejQ7+2st91bmkLG/7/zv/9DrsMItTNHFQeta23zkWnvu363BHwh4iheAT8Zh3aG\nBtuFG6sCwW9CeUjA78GQyc5OEjVNrazcdQRvW2JvgrT5NIdCfjsz2EdyuKGFsvzs3m5WgAR8IeKo\nJC+rR59rCumJJuPDW6FtvuHpTxldmgfAiOIccrPssfXwO/nM8fe/A8AxJbkAnDO+lPc2VvV5Dv9w\nQws+DZdNHcK/Vu6NuM21M0fwzEfG0FJ3nadPA77k8IWII0eGncKcTLLsNr47yyim5vF2nVYwC2r9\n9PLJ/OD8cdQ1e/tFaYDuiBSSIG40AAAWVklEQVSQK6vqsSkoznVQmp8duHIJ3fbrp4/EkWFDdzJM\nyV3nobwgm2tnjsCZnRGoYWS1rdp4svXxr5zA2LK8Pj9xmvs7b2IZ2x6ezfYfzw7b5v7PTeKf35wZ\ntH1fkYAvRJy58hy4nI5Az+1QfddDEc0hhGX52YG00MYDdUk1e1ZHaajiPAd2m/LP/2ukcra6G7DW\noivLz8bj9VHT1EqDx0uL1xc44bV4fTS1tOGu9wT+Xo0TYuQb2/nZGWRn2imznGB6orm1jaraZhpb\nor9K2HnIOOG4nA5sNhU2JSaAUirw/8aGA7VRdQjiRVI6QsTZ0IEDaGhpC8yQ5a7zMLhwQKefMXt6\nLqcDM8Rf+viH3Hb2aL5/3rjebG7cdNRbtR7bxgO1rNx1hKeX7AjaxjzJ3fTX5Xyy/TCjS/OorKpn\nx08u4so/fszynUeYNDifQfnZQTOPTSjPD6svH5iSMs/B9urwWjbRGn/3W4HXO35yUZfba6355nMr\ngtrQkRL/MfzsrU38buFW1tx/fo/b2R3Swxcizn5y+XH8+stTAv/oo7lsN3uiLqcjKKD9fdme3mlk\nL3DXeagozuG5G0+OuN58CnnFrqOBZR/OPZuld5wTOOZPth8GjFSQafnOI4HvdzkdQcH0jtnjI+7H\nur/O0kTRiia9dtTywF1JhOkwrbIz7YHXdX14n0F6+ELEmXm5bl7MR5NWcNd5ArluLPGptY8Lj8XC\nvAF5SsjQQ5PL6aC22RuUwhjiv/Kp7WAeYGspBjOlYw34ZfnZjC3LY/PB9hOEy5kd2J/H66PO4yU/\nu3tPuIaeJKrrPQwd2HnlTevv3NnInESKSw9fKfV9pZRWSpX43yul1KNKqUql1Gql1AldfYcQqabY\nP2Ln9pfXUNvcebkFd52Holwj112U2z7SJ9pyAon22qp9fLLjMCV5jrC8tRnUzV789gglgztKgTy+\nsDLwWmvCAr4rzxE2yiUw6bx/u+ue+qS7hxPW647mKu3C3yzu9n5MFXPns/doU48/H62YA75Sahhw\nHrDLsvhCYIz/z03A72LdjxDJxpHRftm+dk/XZQPMAJVht3HfJRMBGOkfZtjfffdvnwGQaTeC/VPX\nT+PhyyYza0IpL940A2gPwOv2GTn3t757euDzHdWY+dW7wQXoXHkOinKzUMrYV8GATH71pSnMmlDK\n9JFFQfsxA/9KSwopWqEBvquAr7UOXI3cddGEqPbx0jdmBr2fv3pfN1rYM/Ho4f8a+CFBF6LMAZ7R\nho+BQqVUeRz2JURS6qpUgpmuMF1/6kiunD6c6ihG+PQHZrAzg8DZ48u46uThPHndSQzzlxowj29L\nVR3jypyMt0wKH2k0SyQup4NMu42inCxK8oyRMC6ngyevO4kLjx0UtJ9YHoKrqjUC/C+/eDzQdVrO\nekXwpZOGRbWP6SOL+Onlk3vYwp6JKeArpeYAe7XWq0JWDQF2W97v8S8TIi111UN01zYH3awFI2BV\n13t4f+PB3mxanzEDcGub7nEwtgbz0O8IDfTWG6evfBb5IaiOmAF+fLkTgDv/tTbi/ZQPK6t54ZNd\ngRMEgLOH+XtPB8NM46nLgK+UWqCUWhvhzxzgDuCeWBqglLpJKbVMKbXM7XbH8lVC9DsPzpkEdN5D\n1FqH9fChPXB99ellvdfAOBnkz6P/4PyOh5CaqRiI3Ps2UyGTBueHrTOZQfwLJw7l8hOGBq2bXlHE\nOeNLOX6oMZl8YU5mYKz/d178LLoD8TNP0IML2ofT/mdTeHz6ypNLuf3lNYHtJ5bnR321AjB7cnvi\nI6cPbvR2uQet9axIy5VSk4GRwCr/AQ4FViilpgN7Aet1zVD/skjfPw+YBzBt2rTkecpEiChcM7OC\nn721qcs6MJF6va4elmlIhMYWL9fOHNHpSBYzFXOooSViwL/x9GO48fRjAu8r5s4HjKdWP9t9lAaP\nNzD6xbqdqTQ/mz9df1LgvVKKp2+YzrU9uGnrrvME7hGYOhsxdbDWeKDskSumdGs/zuzMqMb4x0uP\nUzpa6zVa61KtdYXWugIjbXOC1voA8CpwrX+0zgygRmu9Pz5NFiK5uJwOnl+6q8MnKt/fWBXYzior\nIzkek2lubaO22RuWkook9IZqtCKlcKKRbwnYTy7exuur9/F6JzdHF6w/yJLKatbsPRq4R2DqaOgo\ntKeMuntcfa23riHeAGYDlUAjcEMv7UeIfs+s7/LLdzZzx+zwERzfe8m4BRYaLCaWFwRe+3w6KPj0\nJ9WWh8a6YjxtWxfVts7sDOqavXz5pGG8v7GqR0NUK4rbrzh+NH9D4PXJI4vD2rB6z1FufKY9fXac\nPzVkFmILvUqzjtVfuMkddkXQH8Ut4Pt7+eZrDdwSr+8WIpll2BRen2ZbhPHn1qARGoAGFWRz3yUT\nue+19RxpbKG4n/YeraUTuhI6Rr4za+5rLzdwzoSyHrWtMCeLH39+MreHzCR2OEJaKXT6RbOtf7r+\nJI677+2w+zC1zcEnoNArgv4oOa4ZhUhioU9d1nu8VFbVs/NQQ9DDNqX54UGw1H8z9NMdRwJ54v6m\nWwHff4ylcZo3IBoZEYLwlqq6sGU7/ROMm6y/R2l+Nhv216K1ZvfhRuqaW8N6/F2VU+gP+ufzv0Kk\nkLPHl/proxu9+WPvfTvidpGG85lB9OZnlwOw9I5z+rR+ejTMnm+ps+t2DS/KIctuo6yg744h0sNr\ntz6/kosmlwdG1DR4vNz7avCUg9YUW3NrG5/uqOfSJ5awarfxINcLX58RtL350Fl/Jj18IXrZjz8/\nmaLcrE6n23v4sskRh/OF5vX31/S/Xr7Z0y2OYlTRF08cxhvfOb3btW1iMa2iiH/cPDNsuTUlUxVh\nFFVxSMAHAsEe2k90nzt+cNza2tsk4AvRy7Iz7Zw8sgh3nSeoGJjVtIqBEZeHpkmONPa/J2+NOkBZ\nUc3NmpVhC8yC1ZemVRSFLbOmZKojPCdhPZ4BWfaw9Qf9J1/zCd9kICkdIfqAy+ngzbUHGHXHGxHX\nF+dG7h2H5v/729SHn+0+ynNLd/X70SmRuOs8OLMzOPnh9yKud2a3/90PG5jD7sPBxc0eesMY9TNk\noPFwVnkXcx70BxLwhegDhTnBAd0cuQNw6ujiTkfgPHrlVOYt2sravbX9LuA//eF2wHh4rL+b/+3T\nONzQwtaqeu57bT3ueg8HaoOD+F0XTaAoN4sGj5eLLE/B/vbKqZz4owURv3fykAJ+8vnJXDi5/5cL\nk5SOEH3AHpKff/GmGcw8xqgbH+mpUavPHT+Y1287HWd2Rr8L+Mlk0uACTh/j4rKpRkkGd50HX8jD\nszecOpLPnzCUa2ZWBA2x7OyErJTiiunDk+IqRwK+EH0gdGSgMzsTu39hpi26f4b52Zk8vWRHvwr6\n5h2JZHkqGCB/gJHYePD19fz2/S1B6+z9fBx9rJLnVxIiiV0zc0QgmIwpzWOUK5cfXXosl04ZzEkj\nI9+wDWWO2f/52xt7rZ3d1eIv+xw6RLE/s46G2mEZe/+NMzq/0jLr18+75kTGDzKqaD5+VXLN7SQ5\nfCH6QGFOFlsfnh20rKIkl0eumNrt7+qqtn5fctd5mHFMESeOiO6k1R8NLshmye3ndLnd9JFFgUJn\n501KnpE5VhLwhUgS1hu9ibZ2rzGDl7vew3FDCxPcmtjkZadPGJSUjhBJwiy81h+C/sW//YCLf/uB\nMTVjEpQUCHX1jOGB14rUzttbScAXIkl89bSRTBsxkMP9aNrDxpa2mKYSTJQfXTqZP99wUtcbphgJ\n+EIkEZfTwfr9tYFH/XtDU0sbG/bXdli/31rh02xTMuroYbdUJgFfiCTicjqoaWrlW8+t6LV9XPnH\nj7nwN4v59gsrI64PLQvcl5Uv48ks9nbmeFeCW9J30uduhRApYECmUdPFnCWrN3zmLxD29rrIk6eH\nPgeQrD38QQXZLPrBWQwu7F/VR3uTBHwhRLekSsAHGF7c8Ry8qUgCvhBJJNHB9edvb+TxhVuDlg3M\nSb9ceLKSHL4QSeS6UyrIstsozOmdui1a60AZiEgzOFmD/Y2njeSxq6amfDmCVCIBX4gkkmm38a2z\nRlHT1EprW/yfuK1t9uLTkJ1p40hjS4f1+wHuvGgCFx+XPJN/CAn4QiQdl9OB1vC1vyxj9+HGrj9g\n0drm44f/WMWO6vAJ1aE9Pz+xPJ82n2beom2BdSt3HQnaNtIMXaJ/k4AvRJIxn2xdtNnNXf9e263P\nbq9u4KVle1i4KfIon0DAH5wPwE/fai/U9uV5Hwde/995Y7u1X9E/SMAXIslYb9x2N61TVWsE9Ehz\nuEL7PK0TywvC1pmVMS8/YSi3nj2mW/sV/YMEfCGSjDXgL9l6KBCIo+GuN+Zh7aimvrl83KD2eWef\nW7ozaM5XTeJr+YieiSngK6XuU0rtVUp95v8z27LudqVUpVJqk1Lq/NibKoSA8NEzf1y8rYMtw5kB\nvbOAn2lXQT38O/+1lmmW6f2unjGiO80V/Ug8evi/1lpP8f95A0ApNRG4ApgEXAA8oZQKn/ZdCNFt\n2ZnB/5S6MwNWNAHfledgQJadR68Mr9U/aXA+JwxP3tr36a63UjpzgBe11h6t9XagEpjeS/sSQkRQ\nWVUXVugsEPDrO87hmymjSGWPZWBOcotHwL9VKbVaKfWUUso89Q8Bdlu22eNfFkYpdZNSaplSapnb\n7Y5Dc4RIfZn29sjbEuHG7YeV1cz61SL+uWJv0HIz0B+q90QcY++uswT8CE/1njshOWd6EoYuA75S\naoFSam2EP3OA3wGjgCnAfuCX3W2A1nqe1nqa1nqay5U+VeuEiMWKu89lxd3nUpLnoDpCembzwToA\nVvkLoZnMHr5Pw+GG8Lr6RsA3iolFCvi3nT065raLxOmylo7WelY0X6SU+iPwuv/tXmCYZfVQ/zIh\nRBw4s43SChPKnRHTM2YmJzQF467zUJKXRXV9S1BvHqDNpznc0L4sP2Tqv0y7wiZlFJJarKN0yi1v\nLwPMp0BeBa5QSjmUUiOBMcAnsexLCBHOleeIeAO2pqkVgGc+2knF3PlUzJ1PY4uXI42tTBxsjMCZ\n/ejiwPaXPfEhjyzYjE+39+xDn6Q1PyeSV6zVMn+mlJoCaGAH8A0ArfU6pdRLwHrAC9yite69KXqE\nSFMupxHwtdZBATpSr3/jASPNM2lwPos2G/fLfD6N16dZuesojR7jn6j1Zu3L3zqF2qZWVuw8wnWn\nVPTikYi+EFPA11pf08m6h4CHYvl+IUTnXE4HHq+POo+X/Oz2CpqRev0b9tcCMKE8P7CspqmVZv9U\nhpXu+sB3mswhmGeOK41/40WfkydthUhiZnC+5smlfPPZ5cxfvR+IHPDX7zMC/oii9kk/Hnx9fWBb\nc9ROsk5ZKLomAV+IJGamX1btqeHNtQe45Xljrlt3nYfBBcFT96339/BdTgcXTDKGV768cm/YySFS\nHXyRGiTgC5HEIg2d1FrjrvNwyZTB/O2mGYHlZg+/OC+LH14wLrDcWkjN6chgQJY8FJ+qJOALkcQi\nBfxVe2poafPhynNQaJl+0OP1kZtlx5FhD/rc35e1PyOZ6CkURe+SgC9EEisYED7V4aWPfwgYwXt4\nUU5QiqahxbhBm+doH6+xYlf7w1klEvBTmgR8IZJYZ7NOuZxGEbRld4U/O6mU4vkbT474GZG6JOAL\nkaK6Gm1TbOn5VxQbI3ciFUwTqUMCvhBJbujAARGXu/LaR+mcP6kMIDA6B6Asvz24jyjOpWBAJmPK\n2ic+Eakn1idthRAJtuB7Z9Da5sPng/tfW8fLK/eSZbeRP6D9n/djV51AVZ0nqNdfmJPF3RdP5MHX\n15Npt7HoB2eRly0hIZXJrytEksvOtAcmRRk7yAkYuXhrfj/TbmNIYfiVgHWsfkFO+A1gkVokpSNE\nCintpJZ9JOaonNGlkspJB9LDFyKFdDZ5SSQnVRTx1PXTOG20zEWRDiTgC5FCuhvwAc4eX9ZbzRH9\njKR0hEgh5rBKqYcjIpEevhAppCg3i++fO5bZx5V3vbFIOxLwhUghSiluO2dMopsh+ilJ6QghRJqQ\ngC+EEGlCAr4QQqQJCfhCCJEmJOALIUSakIAvhBBpQgK+EEKkCQn4QgiRJpTWOtFtCFBKuYGdPfx4\nCVAdx+YkAznm9CDHnB5iOeYRWusuK+D1q4AfC6XUMq31tES3oy/JMacHOeb00BfHLCkdIYRIExLw\nhRAiTaRSwJ+X6AYkgBxzepBjTg+9fswpk8MXQgjRuVTq4QshhOhESgR8pdQFSqlNSqlKpdTcRLcn\nXpRSw5RSC5VS65VS65RS3/EvL1JKvauU2uL/70D/cqWUetT/97BaKXVCYo+gZ5RSdqXUSqXU6/73\nI5VSS/3H9TelVJZ/ucP/vtK/viKR7Y6FUqpQKfUPpdRGpdQGpdTMVP6dlVL/6/9/eq1S6gWlVHYq\n/s5KqaeUUlVKqbWWZd3+XZVS1/m336KUuq6n7Un6gK+UsgOPAxcCE4ErlVITE9uquPEC39daTwRm\nALf4j20u8J7Wegzwnv89GH8HY/x/bgJ+1/dNjovvABss738K/FprPRo4AnzNv/xrwBH/8l/7t0tW\nvwHe0lqPB47HOP6U/J2VUkOAbwPTtNbHAnbgClLzd34auCBkWbd+V6VUEXAvcDIwHbjXPEl0m9Y6\nqf8AM4G3Le9vB25PdLt66VhfAc4FNgHl/mXlwCb/6z8AV1q2D2yXLH+Aof5/BGcDrwMK42GUjNDf\nG3gbmOl/neHfTiX6GHpwzAXA9tC2p+rvDAwBdgNF/t/tdeD8VP2dgQpgbU9/V+BK4A+W5UHbdedP\n0vfwaf+fx7THvyyl+C9jpwJLgTKt9X7/qgNAmf91KvxdPAL8EPD53xcDR7XWXv976zEFjte/vsa/\nfbIZCbiBP/tTWU8qpXJJ0d9Za70X+AWwC9iP8bstJ/V/Z1N3f9e4/d6pEPBTnlIqD/gn8F2tda11\nnTZO+Skx1EopdTFQpbVenui29LEM4ATgd1rrqUAD7Zf5QMr9zgOBORgnusFALuFpj7TQ179rKgT8\nvcAwy/uh/mUpQSmViRHsn9Nav+xffFApVe5fXw5U+Zcn+9/FqcDnlFI7gBcx0jq/AQqVUhn+bazH\nFDhe//oC4FBfNjhO9gB7tNZL/e//gXECSNXfeRawXWvt1lq3Ai9j/Pap/jubuvu7xu33ToWA/ykw\nxn+HPwvj5s+rCW5TXCilFPAnYIPW+leWVa8C5p366zBy++bya/13+2cANZZLx35Pa3271nqo1roC\n43d8X2v9FWAh8AX/ZqHHa/49fMG/fdL1grXWB4DdSqlx/kXnAOtJ0d8ZI5UzQymV4/9/3DzelP6d\nLbr7u74NnKeUGui/OjrPv6z7En1DI043RWYDm4GtwJ2Jbk8cj+s0jMu91cBn/j+zMfKX7wFbgAVA\nkX97hTFiaSuwBmMURMKPo4fHfibwuv/1McAnQCXwd8DhX57tf1/pX39Motsdw/FOAZb5f+t/AwNT\n+XcG7gc2AmuBvwKOVPydgRcw7lO0YlzJfa0nvyvwVf/xVwI39LQ98qStEEKkiVRI6QghhIiCBHwh\nhEgTEvCFECJNSMAXQog0IQFfCCHShAR8IYRIExLwhRAiTUjAF0KINPH/AS10aIiAtnHQAAAAAElF\nTkSuQmCC\n", "text/plain": [ "<Figure size 600x400 with 1 Axes>" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "'''\n", "One final example (taken from Wes Mckinney's book):\n", "\n", "Let's generate a random walk and visualize it\n", "'''\n", "\n", "nsteps = 1000\n", "draws = np.random.randint(0, 2, size = nsteps) #Randint let's us generate random integers in a range\n", "steps = np.where(draws > 0, 1, -1) #there function let's us do boolean logic on a conditional applied to an entire array\n", "walk = steps.cumsum() #Cumsum returns an array with the same size as steps, that has cum sum of steps up to index i\n", "plt.plot(np.arange(len(walk)), walk)\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 30, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.5.2" } }, "nbformat": 4, "nbformat_minor": 0 }