{ "metadata": { "name": "IPythonIntro" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ { "cell_type": "heading", "level": 1, "metadata": {}, "source": [ "Getting Started with IPython and Python for scientific computing" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "First things first: how do I get some help?" ] }, { "cell_type": "code", "collapsed": false, "input": [ "?" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 1 }, { "cell_type": "code", "collapsed": false, "input": [ "%quickref" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 2 }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "Basic concepts" ] }, { "cell_type": "code", "collapsed": false, "input": [ "%magic" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 3 }, { "cell_type": "code", "collapsed": false, "input": [ "%alias?" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 4 }, { "cell_type": "code", "collapsed": false, "input": [ "!pwd" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "/home/fperez/teach/reprosw\r\n" ] } ], "prompt_number": 5 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Tab completion!" ] }, { "cell_type": "code", "collapsed": false, "input": [ "import numpy as np\n", "np" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "pyout", "prompt_number": 10, "text": [ "" ] } ], "prompt_number": 10 }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "Using IPython as a calculator" ] }, { "cell_type": "code", "collapsed": false, "input": [ "2+3" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "pyout", "prompt_number": 13, "text": [ "5" ] } ], "prompt_number": 13 }, { "cell_type": "code", "collapsed": false, "input": [ "_ **2" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "pyout", "prompt_number": 14, "text": [ "25" ] } ], "prompt_number": 14 }, { "cell_type": "code", "collapsed": false, "input": [ "2**100" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "pyout", "prompt_number": 17, "text": [ "1267650600228229401496703205376L" ] } ], "prompt_number": 17 }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "This is Python, after all!" ] }, { "cell_type": "code", "collapsed": false, "input": [ "def factorial(n):\n", " if n==0:\n", " return 1\n", " return n*factorial(n-1)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 18 }, { "cell_type": "code", "collapsed": false, "input": [ "factorial(10)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "pyout", "prompt_number": 19, "text": [ "3628800" ] } ], "prompt_number": 19 }, { "cell_type": "code", "collapsed": false, "input": [ "import this" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "The Zen of Python, by Tim Peters\n", "\n", "Beautiful is better than ugly.\n", "Explicit is better than implicit.\n", "Simple is better than complex.\n", "Complex is better than complicated.\n", "Flat is better than nested.\n", "Sparse is better than dense.\n", "Readability counts.\n", "Special cases aren't special enough to break the rules.\n", "Although practicality beats purity.\n", "Errors should never pass silently.\n", "Unless explicitly silenced.\n", "In the face of ambiguity, refuse the temptation to guess.\n", "There should be one-- and preferably only one --obvious way to do it.\n", "Although that way may not be obvious at first unless you're Dutch.\n", "Now is better than never.\n", "Although never is often better than *right* now.\n", "If the implementation is hard to explain, it's a bad idea.\n", "If the implementation is easy to explain, it may be a good idea.\n", "Namespaces are one honking great idea -- let's do more of those!\n" ] } ], "prompt_number": 20 }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "Plotting in the notebook" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This imports numpy as `np` and matplotlib's plotting routines as `plt`, plus setting lots of other stuff for you to work interactivel very easily:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "%pylab inline" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "\n", "Welcome to pylab, a matplotlib-based Python environment [backend: module://IPython.zmq.pylab.backend_inline].\n", "For more information, type 'help(pylab)'.\n" ] } ], "prompt_number": 21 }, { "cell_type": "code", "collapsed": false, "input": [ "x = np.linspace(0, np.pi, 200)\n", "y = np.sin(x**2)\n", "plt.plot(x, y)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "pyout", "prompt_number": 23, "text": [ "[]" ] }, { "output_type": "display_data", "png": "iVBORw0KGgoAAAANSUhEUgAAAX4AAAD9CAYAAAC7iRw+AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3XlYlXXaB/DvUVDDfUk0IK2ABFQ0LV5L9KihuRGWuVyT\n+Zo11kRNzdhk02ql2fXW9U6TU6PVa9qiZjOmJZI6irkhKVJuKZbUAQE1pVxje94/7o6KbIezPL9n\n+X6ui2tCjuf5zqPc/rif3+LQNE0DERHZRiPVAYiISF8s/ERENsPCT0RkMyz8REQ2w8JPRGQzLPxE\nRDbjU+G/9957ERoaih49etT6mkceeQRRUVGIj4/Hrl27fLkcERH5gU+Ff8qUKUhPT6/162lpaTh0\n6BByc3Mxf/58PPjgg75cjoiI/MCnwp+YmIi2bdvW+vWVK1di8uTJAICEhASUlJSguLjYl0sSEZGP\nggL55gUFBYiIiLjweXh4OPLz8xEaGlrldQ6HI5AxiIgsy5vNFwL+cPfyULUVeU3TTPvx3HPPKc+g\nOvvBgxpSUzW0bauhf38NL7ygYdUqDXv2aMjL03DggIY1azTMmaNh0CAN7dtrmD5dw9Gjxshv9vtv\n9fz792vo3FnDAw9o2LZNw/LlGrp31zBliobKSuPnD9SHtwI64g8LC4PL5brweX5+PsLCwgJ5SdLZ\nkSPA008Dn30GPPAA8PXXwCU/5FURHQ0kJQFPPAHk5QGvvgp06wY8+yyQmgo0bqxrdDKJ4mJgxAhg\n1ixgypSLvz50KDBoEDBzJvD888rimVJAR/zJyclYtGgRACAzMxNt2rSp1uYhc9I04M03gfh4IDQU\nyM0FXnyx9qJ/ua5dgblzgW3bgH//Gxg8GCgqCmhkMqn77gMmTKha9AEgJARYuRJ45x1g61Y12czK\npxH/xIkTsXHjRhw/fhwRERGYOXMmysrKAADTpk3DiBEjkJaWhsjISDRv3hwLFizwS2ijcTqdqiN4\nzZvsP/0E3HsvUFAAbNoko3ZvRUcDGzYAL7wA3Hgj8Pnn8o+Jp8x87wHmr8/nnwMHDwKffFLz10ND\ngTlzgEcfBTIzgUYNHMqa/f57y6H50ijyVwiHw6d+Feln82Zg4kRg/Hhg9mygSRP/vfeyZcBDDwHL\nlwO33OK/9yVzKisDYmKAf/wDGDas9tdVVgL9+km7cNIk/fIZgbe1kyt3yWNLlwJ33AHMmyf9eX8W\nfQC46y7ggw+AMWOAHTv8+95kPkuWAF261F30ARnlz5oFvPKKtCCpfiz8VC9NA157DZg+HVi3Th60\nBcrQocDbbwOjRslzA7InTZPBxeOPe/b6IUPk92zYENhcVhHQWT1kfpom33zp6fIAzdOHt764/Xag\nsBBITpa+bevWgb8mGcu6ddLCqW+07+ZwAI88Avz97zJRgOrGHj/VStOAv/wFWL9evhHrWKQdEA89\nBLhcwIoV8o1N9jFmDDBypMzo8dSZM8DVV8uU4vDwwGUzEvb4ya80DXjqKWDtWvnQu+gDwP/+r0zx\nfOMN/a9N6hw7Ji2bceMa9vuaN5efFpctC0wuK2Hhpxq9+KJMpVu3DmjXTk2GJk3kAd9LLwHffKMm\nA+lv8WJ5xtOqVcN/78SJ8neG6sbCT9W88w6wcKGM9Dt0UJvl2muBl1+WxTu/LREhi1u4EPhtb8cG\nGzRIVoV/951fI1kOCz9VkZYmWzCsXi2LY4zg3nvlH6BXX1WdhALt4EF5sO/tA9qgIGDsWJl6TLVj\n4acLdu6Ukdby5bKi1igcDlk78NprMpoj61q+HEhJ8W3fpjFjpE1JtWPhJwCy2drttwPz58sqSKPp\n2hV47DFZmk/WtXy5FG5fJCYCe/cCx4/7J5MVsfATzp+XFbkPPOD7N10gTZ8u39Br1qhOQoFQUCCt\nHl+3z2naVHr9/HtSOxZ+m9M04A9/kIVZTz2lOk3dmjaVZfmPPw5UVKhOQ/62YoXM3Q8O9v29RoyQ\n51VUMxZ+m/vHP6S3v2CBORZJjRkDtGwJvP++6iTkb6tWAaNH++e9hg+X1eYcINSMK3dtLCtL5ktn\nZsq0SbPYsgW4+25pC/hjdEjqnT8PdOwI/PCD/xYLxsbKAKFPH/+8nxFx5S41yIkTsrXyvHnmKvqA\nbNl87bWykydZw+bNQFycf1eIDxoEZGT47/2shIXfhjRNFkSlpBj7YW5dnnlGzgMoL1edhPzhiy88\n35DNUwMHsvDXhoXfhtx74Lzyiuok3hs4EOjUiQt1rOKLL4DbbvPvew4cKCfEsc9fHQu/zWRmSsFf\nutT/B6noyeGQQ9pnzeI3ttkVFgL5+XL0pj+FhgJXXQXk5Pj3fa2Ahd9G3H39+fNlQZTZ3XqrbOT1\nr3+pTkK+2LgRGDDAt9W6tXE62e6pCQu/TWiaLNBKSZEVulbgcMjaAx65Z24ZGb4v2qpNYqK0e6gq\nFn6bWLQI2LfP3H39mowcCfz8M7Btm+ok5K1AFv5+/aS9yYFBVSz8NvD997LdwUcfAc2aqU7jX40a\nAampPKzFrI4cAY4eBXr2DMz7d+kiPxlyc7+qWPgtrrwcmDQJePLJwH1zqTZliswKOXJEdRJqKHd/\nv1GAKpHDcXHUTxex8Fvcyy8DISHW3tWydWtgwgRZjEbmsnFj4No8bv36sRV4ORZ+C8vKAubOBd57\nL3AjKqNITZXZSqWlqpNQQ2zZAvTvH9hr/Nd/sfBfzuLlwL7OnpX9bObOBcLCVKcJvNhYWfLPg7bN\no6REeu/x8YG9Tt++sp33uXOBvY6ZsPBb1FNPyV/4u+5SnUQ/qanAm2+qTkGe2rZN/o4GeqO9K64A\nunXjQq5LsfBb0JdfAh9/bL+ZLiNHyiHbBw6oTkKe2LpVNtzTQ9++sv04CRZ+izl9Wma5/POfQPv2\nqtPoKzgY+N3vgIULVSchT2zZol/h79OHhf9S3I/fYh56CDhzRh7o2tGePbLZ1w8/BGYLAPKP8nLZ\ngtnlAtq0Cfz1duwA7r0X+OabwF9LT9yPn/Cf/wArVwJ/+5vqJOp07w507gysXas6CdVl92457lOP\nog8APXoAhw7JpAdi4beMX34Bpk4F3n5bv28mo5oyxb4/8ZjFV1/5fzfOujRtKg94v/5av2saGQu/\nRUyfDiQl+X9PczOaMEHOWz15UnUSqo3ehR/gA95LsfBbQHo6sGYN8NprqpMYQ7t2cprT4sWqk1Bt\nvvoKuOkmfa/Zpw+Qna3vNY2Khd/kSkqA++8H3n1X9qYn8d//LTuSkvGcPQscPBj4hVuX69nTeg93\nvcXCb3KPPgokJwNDhqhOYiy33ipz+rkro/Hk5MhK66ZN9b1u9+7A/v08sQ1g4Te1zz6TQyastse+\nPwQHA3fcIQvZyFhU9PcBoGVLOY7x0CH9r200LPwm9dNPcqLWggVAixaq0xjT+PHAkiWqU9DlVBV+\nQKZ17t6t5tpGwsJvUg8/LPvwDBigOolxDRwoB3nn5qpOQpdi4VePhd+E/vUvWYk4e7bqJMbWuDEw\ndiywdKnqJORWUiIH5sTEqLk+H/AKFn6TOXZMdqF87z05YIXqxnaPsezcCfTqBQQFqbk+R/yChd9E\nNA148EHZZ//mm1WnMYebb5ZR5t69qpMQoLbNAwBRUfITx+nT6jIYAQu/iSxZAuzbB7z4ouok5tGo\nkYz62e4xhqwstYU/KEi2brD7QICF3yQKC2XO/qJFQLNmqtOYy7hxPJnLKFSP+AG2ewAWflPQNOD3\nv5ePvn1VpzGfG2+UTex4QItaxcWyZfh116nN0aMHH/Cy8JvAwoWyb/kzz6hOYk6NGgG33w6sWKE6\nib3l5AC9ewMOh9ocPXtyxO9z4U9PT0e3bt0QFRWFV2pYQpqRkYHWrVujd+/e6N27N1566SVfL2kr\nLhfw+ONS/Js0UZ3GvFJSgE8/VZ3C3nbtkhk9qrlbPXY++8mnSVUVFRVITU3FunXrEBYWhhtvvBHJ\nycmIuWyS7sCBA7Fy5UqfgtqRpske+48+qv+GVlbjdMo+LYWFclAL6S8nR85FVq1TJ/mpo7AQuOoq\n1WnU8GnEn5WVhcjISHTt2hXBwcGYMGECVtTw8zSPVfTOvHkyFfGJJ1QnMb8mTeSsgs8+U53EvnJy\njDHidzj4gNenEX9BQQEiIiIufB4eHo7t27dXeY3D4cDWrVsRHx+PsLAwvPrqq4iNja32Xs8///yF\n/3Y6nXA6nb5EM73vvweeflo2YVO12MVqUlKkZfb736tOYj9nzgA//ihTKY3AXfiHDVOdpGEyMjKQ\nkZHh8/v4VFIcHjylueGGG+ByuRASEoLVq1cjJSUFBw8erPa6Swu/3VVWysHQTz6pbmm7FQ0fLmcX\nnDolOzWSfnbvlq2Yg4NVJxE9esigymwuHxTPnDnTq/fxqdUTFhYGl8t14XOXy4Xw8PAqr2nZsiVC\nfttbYPjw4SgrK8OJEyd8uazlvfEGUF4uvX3yn1atgFtukRPLSF9GafO4xcbKMx+78qnw9+3bF7m5\nucjLy0NpaSmWLl2K5OTkKq8pLi6+0OPPysqCpmlo166dL5e1tH37gJdekr14GjdWncZ6UlKA5ctV\np7AfoxX+668Hvv3WvjN7fGr1BAUFYe7cuRg2bBgqKiowdepUxMTEYN68eQCAadOm4ZNPPsFbb72F\noKAghISEYAl3zKrVr78Cv/sd8PLLQGSk6jTWNHo08Ne/yk9UfHain5wc2WPKKNq3lxXwdp3Z49AM\nMOXG4XBw5g+Av/xFziJdvlz9Ihcr690bmDtX2j4UeBUVQOvWsjmakc6FHjgQeO45YPBg1Um8523t\n5Mpdg9iwAfjwQ+Cdd1j0A23ECCAtTXUK+8jNlbnzRir6gMww+vZb1SnUYOE3gJMngcmTgXffBTp0\nUJ3G+lj49WW0/r5bt272fcDLwq+Ye4/9lBRZYESBl5Agc8oLClQnsQf3Hj1GwxE/KfPhhzLHuYZt\njihAgoKAoUOB1atVJ7EHo474Y2JY+EmBvDzgscek+F9xheo09sJ2j36MWvivvhr46SdZ0Gc3LPyK\nlJcDkybJPjxG/KawumHDgP/8BygtVZ3E2oqK5O+6EadMNmoEREfb85wGFn5FZs6UUf6f/qQ6iT11\n7Cg93s2bVSextt27Zf97o85Us2ufn4VfgXXrgP/7P+D992XUQWqw3RN4u3cD3burTlE7u/b5WXZ0\nVlQE3HOPFP3QUNVp7G34cBb+QNuzRzZEMyqO+CngKipkS4b77zf3akGr6NNHzoHNz1edxLr27DH2\niN+uc/lZ+HU0e7YU/2efVZ2EANkEb8gQab2R/1VWyqaDcXGqk9QuOlrOvigvV51EXyz8Otm4EXjz\nTeCjj7jrppEMHQqsWaM6hTUdPiwr0Y22VcOlrrhCjuI8fFh1En2x8OugoACYOFFOfzLitDY7S0qS\nEX9lpeok1mP0No+bHfv8LPwB9uuvwNixQGqqjC7JWLp0Adq2Bb7+WnUS62HhNy4W/gB77DHZmXDG\nDNVJqDZDhwJr16pOYT1Gn8rpZscHvCz8AfTee7I6dOFCztc3sqQk9vkDwehTOd2io+UcDDvhQSwB\nkp0t2wJs3Cjne5Jx/fILEBYmUzt/Ox6afFRaKoevnDwpJ10Z2ZEjsntocbHqJA3Hg1gM5OhR4M47\nZRYPi77xtWol+yVt2qQ6iXUcOAB07Wr8og/IrJ4zZ4Cff1adRD8s/H52/jwwZoycL3rXXarTkKc4\nrdO/zNLmAWQfochIOSnMLlj4/UjTgPvuk7bBzJmq01BDJCXxAa8/mWVGj1t0NAs/eWnWLPnLw4e5\n5tO3r5zKdeyY6iTWYJYZPW5RUSz85IWPPwbefhtYsYKHqphRUBDQvz+QkaE6iTWYbcTPwk8Ntn27\nLNBauVLm7JM5DR4MbNigOoX5nT4tM2Suu051Es/ZbUonC7+Pvv0WuP12YMECID5edRryxaBBwPr1\nqlOY3759sijKTHtSccRPHsvPl7n6r7wCjBypOg35Kj5eevxHjqhOYm5m6+8DsplcZaWcwWsHLPxe\n+uknmQL48MPA5Mmq05A/NGoEDBzIdo+vzDSV083hkFG/Xdo9LPxeOHMGGDVKPqZPV52G/Il9ft+Z\n7cGum52mdLLwN5B7t82YGGnxkLWwz+87M7Z6AHv1+Vn4G+DXX2UrhpAQYP58+fGQrCU2Vn6iy8tT\nncScjh2T1ethYaqTNBwLP1Vz/jxwxx2y98iSJTLvm6zH4ZBRP9s93tm7V/r7ZhwU2WlKJwu/B9xF\nv3lzYPFiIDhYdSIKpMGD2e7xllnbPMDFEb/FNgquEQt/PdybrrVoAXz4IYu+HbhH/HYoAP5m1ge7\nANCmjfxEb8btmRuKhb8Op07JzJ3WreWQdBZ9e4iMlFaFXfq9/mTGqZyXsku7h4W/FkePAk6nLDv/\n8EP29O2EfX7vaJoU/rg41Um8Z5cHvCz8NTh8WDbsGjUK+Oc/zbX0nPyDff6Gc7nkOVj79qqTeI+F\n36a2bgVuuQX44x9lT30zzk4g37HP33Bmb/MALPy29MEHQEoK8O67wEMPqU5DKnXpArRsKdMTyTNm\nfrDrxsJvI+XlwIwZwLPPyihv+HDVicgI2OdvGDNP5XSLjAS++876P+nZvvAXF8tma9nZsq++mR9M\nkX8NGMAD2BvCCiP+li3lo7BQdZLAsnXh//JLoE8fIDERWL0auPJK1YnISAYMkL8jVh/9+UN5OXDg\ngGx5YXZ2OHjdloX/11+ltTNhghyXOHMmZ+5QdV26AE2aWL8I+MOhQ8BVV8msHrOLipL/P1Zmu8K/\nZw+QkADs3w/k5LCfT7VzOGR//o0bVScxPiu0edwiI1n4LePcOeCvf5UHdg8/DHz6KdCxo+pUZHTu\ndg/VzQpTOd3Y6rEATQPS0mQ08t13wDffAFOncn4+eYaF3zNWGvGz1WNyOTkyY+exx4A33gCWLgU6\nd1adiswkOlo26vvhB9VJjM0KUznd3K0eKz/Ut2Th37cPuPtu4LbbZGfNPXuAESNUpyIzcjg46q/P\nuXPAjz/KP5JW0KqVPKQuKlKdJHAsU/g1Tebh33GH9PHj4mSXvT/8gbtqkm9Y+Ov27bfSHrHS95nV\nH/D6XPjT09PRrVs3REVF4ZVaDqF95JFHEBUVhfj4eOzatcvXS1Zx6pQcg9inDzBxoszCOHwYePJJ\n+ZebyFec2VM3K7V53Kz+gNenwl9RUYHU1FSkp6dj3759WLx4Mfbv31/lNWlpaTh06BByc3Mxf/58\nPPjggz4FBqTYL1ki59+GhwPp6cCcOfIv9B//KGfiEvlL9+7A8ePWX83pLSs92HWz+gNenwp/VlYW\nIiMj0bVrVwQHB2PChAlYsWJFldesXLkSkydPBgAkJCSgpKQExQ084ub4cWDdOuC552SVbefOwKJF\nsm3y4cPAv/8tD3EbWaZxRUbSqJFs083tG2pmpamcblYf8ft0vEhBQQEiIiIufB4eHo7t27fX+5r8\n/HyEhoZWed24cc+jrAwoKwM6dHAiKMgJl0t2Rzx9GujZU7ZLfvZZ+V+O6klP7j7/uHGqkxiPFVs9\nRh3xZ2RkICMjw+f38anwOzycDK9dNi+qpt9XWfk8WraUgh4aKi2cO+8EYmJk6Tzn3ZNKAwbIT5lU\nVUkJcPKkfI9ayXXXXZzSaaTa43Q64XQ6L3w+c+ZMr97Hp8IfFhYGl8t14XOXy4Xw8PA6X5Ofn4+w\nsLBq7/XJJ74kIQqs3r2BvDzgxAmgXTvVaYxj716ZQWe1NuulB6936qQ6jf/59MfVt29f5ObmIi8v\nD6WlpVi6dCmSk5OrvCY5ORmLfhsqZWZmok2bNtXaPERGFxwM9OvHPv/ldu+2Xn/fzajtHn/wqfAH\nBQVh7ty5GDZsGGJjYzF+/HjExMRg3rx5mDdvHgBgxIgRuPbaaxEZGYlp06bhzTff9EtwIr1xPn91\nVpzR42blB7wO7fIGvIoQDke15wBERrNpE/CnPwFffaU6iXE4ncDTTwO33qo6if+9+KJs1zFrluok\ntfO2dlqsM0cUODfeKNt5nzqlOokxaJo1p3K6WXn1Lgs/kYeaNZMV4lu3qk5iDEVFMuPFqtubW7nV\nw8JP1AADB7LP7+aev2+k6Y7+ZOVdOln4iRpgwADu2+Nm5Rk9ANC2rRy9efSo6iT+x8JP1AD9+gG7\ndslWxHa3e7esqLcyq/b5WfiJGqB5cxnlZmaqTqKe1Uf8gHXn8rPwEzXQgAFcyFVeLjOc4uJUJwks\nqz7gZeEnaiAu5JJRcOfOQIsWqpMEFkf8RARAdofdvl12krUrO/T3AY74ieg3bdsC114LZGerTqKO\nHfr7gHWndLLwE3nB7u2eb76xR+Fv1w4ICpLDoKyEhZ/IC3Z/wGuXET9gzXYPCz+RFxITgc2bgcpK\n1Un0d/q0nD8cGak6iT6s+ICXhZ/IC506AR06yCZldrN3r5yMF+TTMU7mwRE/EV1g13aPXfr7blZc\nvcvCT+SlxER7PuC1U38fYKuHiC7hntljtal+9bFb4Xe3eqz058zCT+Slrl2lz/3dd6qT6EfT7LN4\ny619ezlM/qefVCfxHxZ+Ii85HPZr9xQWyv/v0FDVSfRltQe8LPxEPrDbQi53m8eqh6/UxmoPeFn4\niXxgt5k9duvvu1ntAS8LP5EPYmKAX34B8vNVJ9GH3fr7bmz1ENEFDgfQv799Rv12m8PvxhE/EVVh\nl3ZPeTlw4ID1D1+pidWmdLLwE/nILg94c3OBq66S4yftpn17KfonTqhO4h8s/EQ+io8HXC5rzfOu\niV0f7ALS0rNSu4eFn8hHQUFAv36yW6eVffONPR/sulnpAS8LP5Ef2KHdY+cRP8ARPxFdxg4reHNy\ngF69VKdQhyN+IqrixhuB/fuBU6dUJwmMEyeAkyflrGG7stLqXRZ+Ij9o1gzo0wfYtk11ksDIyZH+\nfiMbVwy2eoioGiu3e3JygN69VadQq0MHWctghSmdLPxEfmLlhVy7dtm7vw9Ya0onCz+Rn/TrB+zc\nCZw/rzqJ/3HEL6zS52fhJ/KTli2B2Fjgq69UJ/Gvc+ek2Nlxq4bLWWVmDws/kR9Zsc+/dy8QHQ00\nbao6iXps9RBRNVbs87O/fxFH/ERUTf/+MqWzrEx1Ev9hf/8ijviJqJr27eUQ9p07VSfxH474L7ry\nSqC0VBazmRkLP5GfDRoEbNigOoV/VFTI5mws/MLhsMbMHhZ+Ij+zUuE/dEhGuW3aqE5iHFZo97Dw\nE/nZgAHS5y8tVZ3Ed+zvV2eFB7ws/ER+1ratTH/MylKdxHfs71fHET8R1cgq7R4W/up69pQjKM3M\noWnqjw92OBwwQAwiv1m1CnjtNWD9etVJvKdpsjHZ7t3mL3RW5W3t5IifKAASE6XVY+Z9ew4flu2m\nWfSth4WfKABatZK9bTIzVSfx3ldfyQEzZD1eF/4TJ04gKSkJ0dHRGDp0KEpKSmp8XdeuXdGzZ0/0\n7t0bN910k9dBiczG7H1+Fn7r8rrwz5kzB0lJSTh48CCGDBmCOXPm1Pg6h8OBjIwM7Nq1C1lWmOZA\n5KHBg81d+HfsYOG3Kq8f7nbr1g0bN25EaGgoioqK4HQ68e2331Z73TXXXIMdO3agffv2tYfgw12y\noDNngNBQ4OhRICREdZqGqaiQaal5eUC7dqrTUG28rZ1B3l6wuLgYoaGhAIDQ0FAUFxfXGuzWW29F\n48aNMW3aNNx///01vu7555+/8N9OpxNOp9PbaESG0Ly5TIXcuhW49VbVaRrmwAGgY0cWfaPJyMhA\nRkaGz+9T54g/KSkJRUVF1X591qxZmDx5Mk5eslNRu3btcKKGwygLCwvRuXNnHDt2DElJSXjjjTeQ\nmJhYNQRH/GRRzzwDVFYCs2apTtIwCxcCq1cDS5aoTkJ1CciIf+3atbV+zd3i6dSpEwoLC9GxY8ca\nX9e5c2cAwJVXXokxY8YgKyurWuEnsqpBg4Cnn1adouH4YNfavH64m5ycjIULFwIAFi5ciJSUlGqv\nOXv2LE6dOgUAOHPmDNasWYMePXp4e0ki0+nXTxZAnT6tOknDsPBbm9eFf8aMGVi7di2io6Oxfv16\nzJgxAwBw5MgRjBw5EgBQVFSExMRE9OrVCwkJCRg1ahSGDh3qn+REJnDFFUCfPsDmzaqTeK60VP6x\nuuEG1UkoULhlA1GAvfAC8MsvwKuvqk7imexs4J57gD17VCeh+nDLBiKDGjoUqONxmeGwzWN9LPxE\nAda3L+ByAYWFqpN4hoXf+lj4iQIsKEhW8a5bpzqJZ7ZvB7i7irWx8BPpYOhQYM0a1Snqd/KkrNaN\nj1edhAKJhZ9IB0lJ0uevrFSdpG7btsloPzhYdRIKJBZ+Ih1cc41s1bx7t+okdduyBbjlFtUpKNBY\n+Il04h71G9nmzSz8dsDCT6QTo/f5S0uBnTtltTFZGws/kU4GDZIe+rlzqpPULDsbiIyUlhRZGws/\nkU5atZJtmjdtUp2kZlu2AP37q05BemDhJ9LRsGFAWprqFDVjf98+WPiJdDRqFPD554DRtqbSNI74\n7YSFn0hH8fHA+fPAwYOqk1SVmws0awZERKhOQnpg4SfSkcNxcdRvJJy/by8s/EQ6GzUK+Owz1Smq\n2ryZbR47YeEn0tmQITJ18pIjq5XbtImF305Y+Il0dsUVwMCBwBdfqE4iXC75R4inotoHCz+RAkbq\n869fL4vLGrEa2Ab/qIkUGDkSSE8HystVJ5HCP3iw6hSkJxZ+IgXCw4Grr5YtHFTSNBZ+O2LhJ1Jk\n9GhgxQq1GXJzpfhHRanNQfpi4SdSZOxYYNkytat4166VWUYOh7oMpD8WfiJFuneXGT5ZWeoypKcD\nw4eruz6pwcJPpIjDAYwbJ6N+Fc6fBzZulANiyF5Y+IkUGjcO+PhjNe2ezZuBuDigfXv9r01qsfAT\nKRQXB7RoAWzfrv+12eaxLxZ+IoUcDuCuu2TUr7e0NOC22/S/LqnHwk+kmLvPX1mp3zUPHgRKSoC+\nffW7JhkHCz+RYnFxcixjZqZ+11yxArj9dm7TYFf8YycygHHjgMWL9bvep58CKSn6XY+MxaFp6g+B\nczgcMEDPHLUTAAAHn0lEQVQMImW+/x5ISADy84GmTQN7raIiICYGKC4GmjQJ7LUosLytnRzxExnA\ntddKy2fVqsBfa/lymc3Dom9fLPxEBjFlCvDee4G/zuLFwIQJgb8OGRdbPUQGcfq07Ni5Zw9w1VWB\nuYbLBfTqBRQWcsRvBWz1EJlcixbA+PHAO+8E7hpLlgB33MGib3cs/EQG8uCDwPz5QFmZ/99b04AP\nPwQmTvT/e5O5sPATGUjPnsA11wArV/r/vXfsAH75BXA6/f/eZC4s/EQGk5oK/O1v/n/ft98G7r+f\ni7aID3eJDKe8HIiOBj74ALj5Zv+856lT8uB4/36gUyf/vCepx4e7RBYRFAT8+c/A//yP/95z0SI5\nV5dFnwCO+IkM6exZ6fWvXSt9f1+Ul8uZuh99BPTr5598ZAwc8RNZSEgIMGMG8PTTvr/XsmVARASL\nPl3EET+RQZ0/L73+JUu87/VXVAA33ADMng2MHOnffKQeR/xEFtOsGfDCC8Cjj0oB98b778vCsBEj\n/JuNzI2Fn8jA7rlHduucN6/hv/fsWWkVvfaanPRF5MZWD5HB7d0ri6527AC6dPH8902fDhw5Ig91\nyZrY6lEoIyNDdQSvmTk7YI/8cXHAE0/IYS2lpZ6974YNsgvn3//uW7762OH+W5HXhX/ZsmWIi4tD\n48aNkZ2dXevr0tPT0a1bN0RFReGVV17x9nKGZua/PGbODtgn/5//DHTuDDzwQP1n8+blAZMmAe++\nC3To4HPEOtnl/luN14W/R48eWL58OQYMGFDrayoqKpCamor09HTs27cPixcvxv79+729JJFtORzy\noDY3V4p/eXnNrysoAJKS5CeE227TNyOZh9eFv1u3boiOjq7zNVlZWYiMjETXrl0RHByMCRMmYMWK\nFd5eksjWWrYE0tKAH34AbrkFyM6WHTcB+YdgyRKgTx/5h+Hhh9VmJYPTfOR0OrWdO3fW+LVly5Zp\n991334XP33//fS01NbXa6wDwgx/84Ac/vPjwRhDqkJSUhKKiomq/Pnv2bIwePbqu3wpAnjh7QuOM\nHiIi3dRZ+NeuXevTm4eFhcHlcl343OVyITw83Kf3JCIi3/hlOmdtI/a+ffsiNzcXeXl5KC0txdKl\nS5GcnOyPSxIRkZe8LvzLly9HREQEMjMzMXLkSAwfPhwAcOTIEYz8bVOQoKAgzJ07F8OGDUNsbCzG\njx+PmJgY/yQnIiLvePVkwEurV6/Wrr/+ei0yMlKbM2dOja95+OGHtcjISK1nz55adna2nvHqVV/+\nDRs2aK1atdJ69eql9erVS3vxxRcVpKzZlClTtI4dO2rdu3ev9TVGvvf15Tfyvf/xxx81p9OpxcbG\nanFxcdrrr79e4+uMev89yW/k+3/u3Dntpptu0uLj47WYmBhtxowZNb7OqPffk/wNvf+6Ff7y8nLt\nuuuu0w4fPqyVlpZq8fHx2r59+6q8ZtWqVdrw4cM1TdO0zMxMLSEhQa949fIk/4YNG7TRo0crSli3\nL7/8UsvOzq61cBr53mta/fmNfO8LCwu1Xbt2aZqmaadOndKio6NN9Xffk/xGvv+apmlnzpzRNE3T\nysrKtISEBG3Tpk1Vvm7k+69p9edv6P3XbcsGT+b0r1y5EpMnTwYAJCQkoKSkBMXFxXpFrJOnaxI0\ng85QSkxMRNu2bWv9upHvPVB/fsC4975Tp07o1asXAKBFixaIiYnBkSNHqrzGyPffk/yAce8/AISE\nhAAASktLUVFRgXbt2lX5upHvP1B/fqBh91+3wl9QUICIiIgLn4eHh6OgoKDe1+Tn5+sVsU6e5Hc4\nHNi6dSvi4+MxYsQI7Nu3T++YXjPyvfeEWe59Xl4edu3ahYSEhCq/bpb7X1t+o9//yspK9OrVC6Gh\noRg0aBBiY2OrfN3o97++/A29/3VO5/Qnb+f0e/r7As2THDfccANcLhdCQkKwevVqpKSk4ODBgzqk\n8w+j3ntPmOHenz59GmPHjsXrr7+OFi1aVPu60e9/XfmNfv8bNWqEnJwc/Pzzzxg2bBgyMjLgdDqr\nvMbI97++/A29/7qN+D2Z03/5a/Lz8xEWFqZXxDp5kr9ly5YXfiQbPnw4ysrKcOLECV1zesvI994T\nRr/3ZWVluPPOO3H33XcjJSWl2teNfv/ry2/0++/WunVrjBw5Ejt27Kjy60a//2615W/o/det8Hsy\npz85ORmLFi0CAGRmZqJNmzYIDQ3VK2KdPMlfXFx8YdSQlZUFTdNq7MUZkZHvvSeMfO81TcPUqVMR\nGxuLRx99tMbXGPn+e5LfyPf/+PHjKCkpAQCcO3cOa9euRe/evau8xsj335P8Db3/urV6Lp3TX1FR\ngalTpyImJgbzfjtaaNq0aRgxYgTS0tIQGRmJ5s2bY8GCBXrFq5cn+T/55BO89dZbCAoKQkhICJYs\nWaI49UUTJ07Exo0bcfz4cURERGDmzJkoKysDYPx7D9Sf38j3fsuWLfjggw/Qs2fPC9+ws2fPxo8/\n/gjA+Pffk/xGvv+FhYWYPHkyKisrUVlZiUmTJmHIkCGmqT2e5G/o/TfECVxERKQfnsBFRGQzLPxE\nRDbDwk9EZDMs/ERENsPCT0RkMyz8REQ28/99dxShphKtHAAAAABJRU5ErkJggg==\n", "text": [ "" ] } ], "prompt_number": 23 }, { "cell_type": "code", "collapsed": false, "input": [], "language": "python", "metadata": {}, "outputs": [] } ], "metadata": {} } ] }