{ "metadata": { "name": "" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ { "cell_type": "code", "collapsed": false, "input": [ "# http://ipython.org/ipython-doc/rel-1.1.0/api/generated/IPython.core.magics.pylab.html#\n", "%pylab --no-import-all inline" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Populating the interactive namespace from numpy and matplotlib\n" ] } ], "prompt_number": 1 }, { "cell_type": "heading", "level": 1, "metadata": {}, "source": [ "Warm up with sequences, lists" ] }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "Warm-up exercise I: verifying sum of integers calculated by (young) Gauss" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "![C. F. Gauss](http://upload.wikimedia.org/wikipedia/commons/thumb/9/9b/Carl_Friedrich_Gauss.jpg/220px-Carl_Friedrich_Gauss.jpg)\n", "\n", "http://mathandmultimedia.com/2010/09/15/sum-first-n-positive-integers/\n", "\n", "> Gauss displayed his genius at an early age. According to anecdotes, when he was in primary school, he was punished by his teacher due to misbehavior. He was told to add the numbers from 1 to 100. He was able to compute its sum, which is 5050, in a matter of seconds.\n", "\n", "> Now, how on earth did he do it?\n", "\n", "See also:\n", "\n", "* http://en.wikipedia.org/wiki/Carl_Friedrich_Gauss#Anecdotes\n", "* [The Gauss Christmath Special](http://youtu.be/sxnX5_LbBDU?t=4m52s) by [Vi Hart](http://en.wikipedia.org/wiki/Vi_Hart)\n", "\n", "**Let's verify this result in a number of ways. Take some time now to write some code to add up 1 to 100.**\n", "\n", "Specifically:\n", "\n", "* make use of [range](http://docs.python.org/2/library/functions.html#range)\n", "* try [xrange](http://docs.python.org/2/library/functions.html#xrange)\n", "* try an explicit loop vs `sum`\n", "* bonus: try [itertool.count](http://docs.python.org/2/library/itertools.html#itertools.count) and [itertool.islice](http://docs.python.org/2/library/itertools.html#itertools.islice) -- these functions are Python *iterators*. \n", "* See [Build a Basic Python Iterator](http://stackoverflow.com/a/24377/7782) and \n", "[The Python yield keyword explained](http://stackoverflow.com/questions/231767/the-python-yield-keyword-explained)\n", "\n", "\n", "**Beware: in ipython w/ pylab mode, `sum` might be overwritten by numpy's sum -- use `__builtin__.sum` if you want http://docs.python.org/2/library/functions.html#sum as opposed to http://docs.scipy.org/doc/numpy/reference/generated/numpy.sum.html** \n" ] }, { "cell_type": "code", "collapsed": false, "input": [ "# using loop and xrange\n", "\n", "n = 100\n", "\n", "s = 0L\n", "for i in xrange(n+1):\n", " s += i\n", "print s" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "5050\n" ] } ], "prompt_number": 2 }, { "cell_type": "code", "collapsed": false, "input": [ "# using builtin sum and range\n", "\n", "print range(101)\n", "sum(range(101))" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100]\n" ] }, { "metadata": {}, "output_type": "pyout", "prompt_number": 3, "text": [ "5050" ] } ], "prompt_number": 3 }, { "cell_type": "code", "collapsed": false, "input": [ "# xrange\n", "sum(xrange(101))" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 4, "text": [ "5050" ] } ], "prompt_number": 4 }, { "cell_type": "code", "collapsed": false, "input": [ "# itertools is a great library\n", "# http://docs.python.org/2/library/itertools.html#itertools.count\n", "# itertools.count(start=0, step=1):\n", "# \"Make an iterator that returns evenly spaced values starting with step.\"\n", "\n", "from itertools import islice, count\n", "c = count(0, 1)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 5 }, { "cell_type": "code", "collapsed": false, "input": [ "# look at how count() works by repetively calling c.next()\n", "print c.next()\n", "print c.next()\n", "print c.next()" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "0\n", "1\n", "2\n" ] } ], "prompt_number": 6 }, { "cell_type": "code", "collapsed": false, "input": [ "# let's add up using count and islice to limit how high we count\n", "\n", "# also make sure we're also using the builtin sum \n", "# http://docs.python.org/2/library/functions.html#sum\n", "\n", "__builtin__.sum(islice(count(0,1), 101L))" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 7, "text": [ "5050" ] } ], "prompt_number": 7 }, { "cell_type": "code", "collapsed": false, "input": [ "# generator for the lowercase English alphabet\n", "\n", "import string\n", "\n", "def alpha1():\n", " m = list(string.lowercase)\n", " while m:\n", " yield m.pop(0)\n", " " ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 8 }, { "cell_type": "code", "collapsed": false, "input": [ "import string\n", "\n", "# make a generator comprehension -- generate items on demand\n", "\n", "k = (s for s in list(string.lowercase))\n", "k" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 9, "text": [ " at 0x105cb9550>" ] } ], "prompt_number": 9 }, { "cell_type": "code", "collapsed": false, "input": [ "k.next()" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 10, "text": [ "'a'" ] } ], "prompt_number": 10 }, { "cell_type": "code", "collapsed": false, "input": [ "# compare to k1, a list comprehension\n", "k1 = [s for s in list(string.lowercase)]\n", "k1" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 11, "text": [ "['a',\n", " 'b',\n", " 'c',\n", " 'd',\n", " 'e',\n", " 'f',\n", " 'g',\n", " 'h',\n", " 'i',\n", " 'j',\n", " 'k',\n", " 'l',\n", " 'm',\n", " 'n',\n", " 'o',\n", " 'p',\n", " 'q',\n", " 'r',\n", " 's',\n", " 't',\n", " 'u',\n", " 'v',\n", " 'w',\n", " 'x',\n", " 'y',\n", " 'z']" ] } ], "prompt_number": 11 }, { "cell_type": "code", "collapsed": false, "input": [ "# create my own version of itertools.count\n", "\n", "def my_count(start, step):\n", " n = start\n", " while True:\n", " yield n\n", " n += step\n", " \n", "__builtin__.sum(islice(my_count(0,1), 101L))" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 12, "text": [ "5050" ] } ], "prompt_number": 12 }, { "cell_type": "heading", "level": 3, "metadata": {}, "source": [ "Triangular numbers" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "$T_n= \\sum_{k=1}^n k = 1+2+3+ \\dotsb +n = \\frac{n(n+1)}{2} = {n+1 \\choose 2}$" ] }, { "cell_type": "code", "collapsed": false, "input": [ "from itertools import islice\n", "\n", "def triangular():\n", " n = 1\n", " i = 1\n", " while True:\n", " yield n\n", " i +=1\n", " n += i\n" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 13 }, { "cell_type": "code", "collapsed": false, "input": [ "for i, n in enumerate(islice(triangular(), 10)):\n", " print i+1, n" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "1 1\n", "2 3\n", "3 6\n", "4 10\n", "5 15\n", "6 21\n", "7 28\n", "8 36\n", "9 45\n", "10 55\n" ] } ], "prompt_number": 14 }, { "cell_type": "code", "collapsed": false, "input": [ "list(islice(triangular(), 100))[-1]" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 15, "text": [ "5050" ] } ], "prompt_number": 15 }, { "cell_type": "code", "collapsed": false, "input": [ "list(islice(triangular(),99,100))[0]" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 16, "text": [ "5050" ] } ], "prompt_number": 16 }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "Warm Up Exercise II: Wheat and chessboard problem" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "http://en.wikipedia.org/wiki/Wheat_and_chessboard_problem :\n", "\n", "> If a chessboard were to have wheat placed upon each square such that one grain were placed on the first square, two on the second, four on the third, and so on (doubling the number of grains on each subsequent square), how many grains of wheat would be on the chessboard at the finish?\n", "\n", "> The total number of grains equals 18,446,744,073,709,551,615, which is a much higher number than most people intuitively expect.\n", "\n", "* try using [pow](http://docs.python.org/2/library/functions.html#pow)" ] }, { "cell_type": "code", "collapsed": false, "input": [ "# Legend of the Chessboard YouTube video\n", "\n", "from IPython.display import YouTubeVideo\n", "YouTubeVideo('t3d0Y-JpRRg')" ], "language": "python", "metadata": {}, "outputs": [ { "html": [ "\n", " \n", " " ], "metadata": {}, "output_type": "pyout", "prompt_number": 17, "text": [ "" ] } ], "prompt_number": 17 }, { "cell_type": "code", "collapsed": false, "input": [ "# generator comprehension\n", "\n", "k = (pow(2,n) for n in xrange(64))\n", "k.next()" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 18, "text": [ "1" ] } ], "prompt_number": 18 }, { "cell_type": "code", "collapsed": false, "input": [ "__builtin__.sum((pow(2,n) for n in xrange(64)))" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 19, "text": [ "18446744073709551615L" ] } ], "prompt_number": 19 }, { "cell_type": "code", "collapsed": false, "input": [ "pow(2,64) -1" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 20, "text": [ "18446744073709551615L" ] } ], "prompt_number": 20 }, { "cell_type": "heading", "level": 1, "metadata": {}, "source": [ "Slicing/Indexing Review" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "http://stackoverflow.com/a/509295/7782\n", "\n", "Use on any of the **sequence** types ([python docs on sequence types](http://docs.python.org/2/library/stdtypes.html#sequence-types-str-unicode-list-tuple-bytearray-buffer-xrange)):\n", "\n", "> There are seven sequence types: strings, Unicode strings, lists, tuples, bytearrays, buffers, and xrange objects.\n", "\n", "The use of square brackets are for accessing *slices* of sequence." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's remind ourselves of how to use slices\n", "\n", "* `s[i]`\n", "* `s[i:j]`\n", "* `s[i:j:k]`\n", "* meaning of negative indices\n", "* 0-base counting\n", "\n" ] }, { "cell_type": "code", "collapsed": false, "input": [ "m = range(10)\n", "m" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 21, "text": [ "[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]" ] } ], "prompt_number": 21 }, { "cell_type": "code", "collapsed": false, "input": [ "m[0]" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 22, "text": [ "0" ] } ], "prompt_number": 22 }, { "cell_type": "code", "collapsed": false, "input": [ "m[-1]" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 23, "text": [ "9" ] } ], "prompt_number": 23 }, { "cell_type": "code", "collapsed": false, "input": [ "m[::-1]" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 24, "text": [ "[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]" ] } ], "prompt_number": 24 }, { "cell_type": "code", "collapsed": false, "input": [ "m[2:3]" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 25, "text": [ "[2]" ] } ], "prompt_number": 25 }, { "cell_type": "code", "collapsed": false, "input": [ "import string\n", "alphabet = string.lowercase\n", "\n", "alphabet" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 26, "text": [ "'abcdefghijklmnopqrstuvwxyz'" ] } ], "prompt_number": 26 }, { "cell_type": "code", "collapsed": false, "input": [ "# 13 letter of the alphabet\n", "alphabet[12]" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 27, "text": [ "'m'" ] } ], "prompt_number": 27 }, { "cell_type": "markdown", "metadata": {}, "source": [ "**We will revisit generalized slicing in NumPy.**" ] }, { "cell_type": "heading", "level": 1, "metadata": {}, "source": [ " Import/naming conventions and pylab mode" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "\n", " import numpy as np\n", " import pandas as pd\n", " import matplotlib.pyplot as plt\n", " from pandas import Series, DataFrame\n", " \n", "These imports done for you in `pylab` mode.\n", "\n", "## pylab mode\n", "\n", " ipython --help\n", " \n", "yields\n", "\n", " --pylab= (InteractiveShellApp.pylab)\n", " Default: None\n", " Choices: ['tk', 'qt', 'wx', 'gtk', 'osx', 'inline', 'auto']\n", " Pre-load matplotlib and numpy for interactive use, selecting a particular\n", " matplotlib backend and loop integration." ] }, { "cell_type": "code", "collapsed": false, "input": [ "import numpy as np\n", "import pandas as pd\n", "import matplotlib.pyplot as plt\n", "from pandas import Series, DataFrame" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 28 }, { "cell_type": "heading", "level": 1, "metadata": {}, "source": [ "NumPy" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ ":\n", "\n", "NumPy is the **fundamental package for scientific computing with Python**. It contains among other things:\n", "\n", "* a powerful N-dimensional array object [let's start with 1 and 2 dimensions]\n", "* sophisticated (**broadcasting**) functions [what is *broadcasting*?]\n", "* tools for integrating C/C++ and Fortran code [why useful?]\n", "* useful linear algebra, Fourier transform, and random number capabilities\n", "\n", "Besides its obvious scientific uses, NumPy can also be used as an efficient\n", "multi-dimensional container of **generic data**. **Arbitrary data-types** can be\n", "defined. This allows NumPy to seamlessly and speedily integrate with a wide\n", "variety of databases.\n", "\n", "See `PfDA`, Chapter 4\n" ] }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "ndarray.ndim, ndarray.shape" ] }, { "cell_type": "code", "collapsed": false, "input": [ "# first: a numpy array of zero-dimension\n", "\n", "a0 = np.array(5)\n", "a0" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 29, "text": [ "array(5)" ] } ], "prompt_number": 29 }, { "cell_type": "markdown", "metadata": {}, "source": [ "use [shape](http://docs.scipy.org/doc/numpy/reference/generated/numpy.ndarray.shape.html) to get a tuple of array dimensions" ] }, { "cell_type": "code", "collapsed": false, "input": [ "a0.ndim, a0.shape" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 30, "text": [ "(0, ())" ] } ], "prompt_number": 30 }, { "cell_type": "code", "collapsed": false, "input": [ "# 1-d array\n", "a1 = np.array([1,2])\n", "a1.ndim, a1.shape" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 31, "text": [ "(1, (2,))" ] } ], "prompt_number": 31 }, { "cell_type": "code", "collapsed": false, "input": [ "# 2-d array\n", "\n", "a2 = np.array(([1,2], [3,4]))\n", "a2.ndim, a2.shape" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 32, "text": [ "(2, (2, 2))" ] } ], "prompt_number": 32 }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "dtype: type of given ndarray" ] }, { "cell_type": "code", "collapsed": false, "input": [ "a2.dtype" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 33, "text": [ "dtype('int64')" ] } ], "prompt_number": 33 }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "np.arange" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "[arange](http://docs.scipy.org/doc/numpy/reference/generated/numpy.arange.html#numpy.arange) is one instance of [`ndarray` creating function in NumPy](http://docs.scipy.org/doc/numpy/reference/routines.array-creation.html)\n", "\n", "Compare to `xrange`." ] }, { "cell_type": "code", "collapsed": false, "input": [ "from numpy import arange" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 34 }, { "cell_type": "code", "collapsed": false, "input": [ "type(arange(10))" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 35, "text": [ "numpy.ndarray" ] } ], "prompt_number": 35 }, { "cell_type": "code", "collapsed": false, "input": [ "for k in arange(10):\n", " print k" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "0\n", "1\n", "2\n", "3\n", "4\n", "5\n", "6\n", "7\n", "8\n", "9\n" ] } ], "prompt_number": 36 }, { "cell_type": "code", "collapsed": false, "input": [ "list(arange(10)) == list(xrange(10))" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 37, "text": [ "True" ] } ], "prompt_number": 37 }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "NumPy.ndarray.reshape" ] }, { "cell_type": "code", "collapsed": false, "input": [ "#how to map 0..63 -> 2x2 array\n", "a3 = np.arange(64).reshape(8,8)\n", "a3" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 38, "text": [ "array([[ 0, 1, 2, 3, 4, 5, 6, 7],\n", " [ 8, 9, 10, 11, 12, 13, 14, 15],\n", " [16, 17, 18, 19, 20, 21, 22, 23],\n", " [24, 25, 26, 27, 28, 29, 30, 31],\n", " [32, 33, 34, 35, 36, 37, 38, 39],\n", " [40, 41, 42, 43, 44, 45, 46, 47],\n", " [48, 49, 50, 51, 52, 53, 54, 55],\n", " [56, 57, 58, 59, 60, 61, 62, 63]])" ] } ], "prompt_number": 38 }, { "cell_type": "code", "collapsed": false, "input": [ "# 2nd row, 3rd column --> remember index starts at 0\n", "a3[1,2]" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 39, "text": [ "10" ] } ], "prompt_number": 39 }, { "cell_type": "code", "collapsed": false, "input": [ "# check that reshape works\n", "\n", "for i in range(8):\n", " for j in range(8):\n", " if a3[i,j] != i*8 + j:\n", " print i, j" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 40 }, { "cell_type": "markdown", "metadata": {}, "source": [ "##scalar multiplication\n", "\n", "example of [broadcasting](http://docs.scipy.org/doc/numpy/user/basics.broadcasting.html):\n", "\n", "> The term broadcasting describes how numpy treats arrays with different shapes during arithmetic operations. Subject to certain constraints, the smaller array is \u201cbroadcast\u201d across the larger array so that they have compatible shapes. Broadcasting provides a means of vectorizing array operations so that looping occurs in C instead of Python. It does this without making needless copies of data and usually leads to efficient algorithm implementations. There are, however, cases where broadcasting is a bad idea because it leads to inefficient use of memory that slows computation." ] }, { "cell_type": "code", "collapsed": false, "input": [ "2*a3" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 41, "text": [ "array([[ 0, 2, 4, 6, 8, 10, 12, 14],\n", " [ 16, 18, 20, 22, 24, 26, 28, 30],\n", " [ 32, 34, 36, 38, 40, 42, 44, 46],\n", " [ 48, 50, 52, 54, 56, 58, 60, 62],\n", " [ 64, 66, 68, 70, 72, 74, 76, 78],\n", " [ 80, 82, 84, 86, 88, 90, 92, 94],\n", " [ 96, 98, 100, 102, 104, 106, 108, 110],\n", " [112, 114, 116, 118, 120, 122, 124, 126]])" ] } ], "prompt_number": 41 }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "add 2 to all elements in a3" ] }, { "cell_type": "code", "collapsed": false, "input": [ "a3+2" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 42, "text": [ "array([[ 2, 3, 4, 5, 6, 7, 8, 9],\n", " [10, 11, 12, 13, 14, 15, 16, 17],\n", " [18, 19, 20, 21, 22, 23, 24, 25],\n", " [26, 27, 28, 29, 30, 31, 32, 33],\n", " [34, 35, 36, 37, 38, 39, 40, 41],\n", " [42, 43, 44, 45, 46, 47, 48, 49],\n", " [50, 51, 52, 53, 54, 55, 56, 57],\n", " [58, 59, 60, 61, 62, 63, 64, 65]])" ] } ], "prompt_number": 42 }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "sorting" ] }, { "cell_type": "code", "collapsed": false, "input": [ "# reverse sort -- best way?\n", "#http://stackoverflow.com/a/6771620/7782\n", "\n", "np.sort(np.arange(100))[::-1]" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 43, "text": [ "array([99, 98, 97, 96, 95, 94, 93, 92, 91, 90, 89, 88, 87, 86, 85, 84, 83,\n", " 82, 81, 80, 79, 78, 77, 76, 75, 74, 73, 72, 71, 70, 69, 68, 67, 66,\n", " 65, 64, 63, 62, 61, 60, 59, 58, 57, 56, 55, 54, 53, 52, 51, 50, 49,\n", " 48, 47, 46, 45, 44, 43, 42, 41, 40, 39, 38, 37, 36, 35, 34, 33, 32,\n", " 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15,\n", " 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0])" ] } ], "prompt_number": 43 }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "Boolean slice: important novel type of slicing" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**This stuff is a bit tricky** (see PfDA, pp. 89-92)\n", "\n", "Consider example of picking out whole numbers less than 20 that are evenly divisible by 3. Generate a list of such numbers" ] }, { "cell_type": "code", "collapsed": false, "input": [ "# list comprehension\n", "\n", "[i for i in xrange(20) if i % 3 == 0]" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 44, "text": [ "[0, 3, 6, 9, 12, 15, 18]" ] } ], "prompt_number": 44 }, { "cell_type": "code", "collapsed": false, "input": [ "a3 = np.arange(20) \n", "a3" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 45, "text": [ "array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,\n", " 17, 18, 19])" ] } ], "prompt_number": 45 }, { "cell_type": "code", "collapsed": false, "input": [ "# basic indexing\n", "\n", "print a3[0]\n", "print a3[::-1]\n", "print a3[2:5]" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "0\n", "[19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0]\n", "[2 3 4]\n" ] } ], "prompt_number": 46 }, { "cell_type": "code", "collapsed": false, "input": [ "np.mod(a3, 3)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 47, "text": [ "array([0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1])" ] } ], "prompt_number": 47 }, { "cell_type": "code", "collapsed": false, "input": [ "np.mod(a3, 3) == 0" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 48, "text": [ "array([ True, False, False, True, False, False, True, False, False,\n", " True, False, False, True, False, False, True, False, False,\n", " True, False], dtype=bool)" ] } ], "prompt_number": 48 }, { "cell_type": "code", "collapsed": false, "input": [ "divisible_by_3 = np.mod(a3, 3) == 0" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 49 }, { "cell_type": "code", "collapsed": false, "input": [ "a3[divisible_by_3]" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 50, "text": [ "array([ 0, 3, 6, 9, 12, 15, 18])" ] } ], "prompt_number": 50 }, { "cell_type": "code", "collapsed": false, "input": [ "# if you want to understand this in terms of the overloaded operators -- don't worry if you don't get this.\n", "a3.__getitem__(np.mod(a3,3).__eq__(0))" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 51, "text": [ "array([ 0, 3, 6, 9, 12, 15, 18])" ] } ], "prompt_number": 51 }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "Exercise: Calculate a series that holds all the squares less than 100" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Use arange, np.sqrt, [astype](http://docs.scipy.org/doc/numpy/reference/generated/numpy.ndarray.astype.html)" ] }, { "cell_type": "code", "collapsed": false, "input": [ "a4 = arange(100)\n", "a4sqrt = np.sqrt(a4)\n", "a4[a4sqrt == a4sqrt.astype(np.int)]" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 52, "text": [ "array([ 0, 1, 4, 9, 16, 25, 36, 49, 64, 81])" ] } ], "prompt_number": 52 }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "We will come back to indexing later." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "http://docs.scipy.org/doc/numpy/reference/arrays.indexing.html" ] }, { "cell_type": "heading", "level": 1, "metadata": {}, "source": [ "Pandas" ] }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "pandas.Series" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Make a series out of an array" ] }, { "cell_type": "code", "collapsed": false, "input": [ "s1 = Series(arange(5))" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 53 }, { "cell_type": "markdown", "metadata": {}, "source": [ " confirm that the type of s1 is what you would expect" ] }, { "cell_type": "code", "collapsed": false, "input": [ "type(s1)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 54, "text": [ "pandas.core.series.Series" ] } ], "prompt_number": 54 }, { "cell_type": "markdown", "metadata": {}, "source": [ "show that the series is also an array" ] }, { "cell_type": "code", "collapsed": false, "input": [ "s1.ndim, isinstance(s1, np.ndarray)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 55, "text": [ "(1, True)" ] } ], "prompt_number": 55 }, { "cell_type": "code", "collapsed": false, "input": [ "s1.index" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 56, "text": [ "Int64Index([0, 1, 2, 3, 4], dtype=int64)" ] } ], "prompt_number": 56 }, { "cell_type": "code", "collapsed": false, "input": [ "import string\n", "allTheLetters = string.lowercase\n", "allTheLetters" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 57, "text": [ "'abcdefghijklmnopqrstuvwxyz'" ] } ], "prompt_number": 57 }, { "cell_type": "code", "collapsed": false, "input": [ "s2 = Series(data=arange(5), index=list(allTheLetters)[:5])\n", "s2" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 58, "text": [ "a 0\n", "b 1\n", "c 2\n", "d 3\n", "e 4\n", "dtype: int64" ] } ], "prompt_number": 58 }, { "cell_type": "code", "collapsed": false, "input": [ "s2.index" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 59, "text": [ "Index([u'a', u'b', u'c', u'd', u'e'], dtype=object)" ] } ], "prompt_number": 59 }, { "cell_type": "markdown", "metadata": {}, "source": [ "http://my.safaribooksonline.com/book/programming/python/9781449323592/5dot-getting-started-with-pandas/id2828378 :\n", "\n", "> Compared with a regular NumPy array, you can use values in the index when selecting single values or a set of values" ] }, { "cell_type": "code", "collapsed": false, "input": [ "# can use both numeric indexing and the labels\n", "s2[0], s2['a']" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 60, "text": [ "(0, 0)" ] } ], "prompt_number": 60 }, { "cell_type": "code", "collapsed": false, "input": [ "for i in range(len(s2)):\n", " print i, s2[i]" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "0 0\n", "1 1\n", "2 2\n", "3 3\n", "4 4\n" ] } ], "prompt_number": 61 }, { "cell_type": "markdown", "metadata": {}, "source": [ "it is possible conflict in indexing -- consider" ] }, { "cell_type": "code", "collapsed": false, "input": [ "s3 = Series(data=['albert', 'betty', 'cathy'], index=[3,1, 0])\n", "s3" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 62, "text": [ "3 albert\n", "1 betty\n", "0 cathy\n", "dtype: object" ] } ], "prompt_number": 62 }, { "cell_type": "code", "collapsed": false, "input": [ "s3[0], list(s3)[0]" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 63, "text": [ "('cathy', 'albert')" ] } ], "prompt_number": 63 }, { "cell_type": "markdown", "metadata": {}, "source": [ "but slicing works to return specific numeric index" ] }, { "cell_type": "code", "collapsed": false, "input": [ "s3[::-1]" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 64, "text": [ "0 cathy\n", "1 betty\n", "3 albert\n", "dtype: object" ] } ], "prompt_number": 64 }, { "cell_type": "code", "collapsed": false, "input": [ "for i in range(len(s3)):\n", " print i, s3[i:i+1]" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "0 3 albert\n", "dtype: object\n", "1 1 betty\n", "dtype: object\n", "2 0 cathy\n", "dtype: object\n" ] } ], "prompt_number": 65 }, { "cell_type": "code", "collapsed": false, "input": [ "s3.name = 'person names'\n", "s3.name" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 66, "text": [ "'person names'" ] } ], "prompt_number": 66 }, { "cell_type": "code", "collapsed": false, "input": [ "s3.index.name = 'confounding label'\n", "s3.index.name" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 67, "text": [ "'confounding label'" ] } ], "prompt_number": 67 }, { "cell_type": "code", "collapsed": false, "input": [ "s3" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 68, "text": [ "confounding label\n", "3 albert\n", "1 betty\n", "0 cathy\n", "Name: person names, dtype: object" ] } ], "prompt_number": 68 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Important points remaining:\n", "\n", "* \"NumPy array operations, such as filtering with a boolean array, scalar multiplication, or applying math functions, will preserve the index-value link\"\n", "* \"Another way to think about a Series is as a fixed-length, ordered dict, as it is a mapping of index values to data values. It can be substituted into many functions that expect a dict\"" ] }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "Gauss & Chess revisited, using Series" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You get some nice `matplotlib` integration via pandas" ] }, { "cell_type": "code", "collapsed": false, "input": [ "# Gauss addition using np.arange, Series \n", "\n", "from pandas import Series\n", "Series(arange(101).cumsum()).plot()" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 69, "text": [ "" ] }, { "metadata": {}, "output_type": "display_data", "png": "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\nB/DCgvzf9NdYAAAAAElFTkSuQmCC\n", "text": [ "" ] } ], "prompt_number": 69 }, { "cell_type": "code", "collapsed": false, "input": [ "from pandas import Series\n", "Series((pow(2,k) for k in xrange(64)), dtype=np.float64).cumsum().plot()" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 70, "text": [ "" ] }, { "metadata": {}, "output_type": "display_data", "png": "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\nzdlB+Z3mxvzq1EVEXMTNQ12duoh4zpAhgWPUbTijtKuzU0NdRDzl/Hno1w/OnoVrrnE6Tef0QWmY\n2Nwr2pwdlN9pbsv/0Ufwta/ZMdBD0elQLy4uZty4cSQlJbF27dorHi8pKWHQoEH4/X78fj9PPPFE\nWIKKiPQEN/fp0En90tzczNixY9m+fTtxcXHcdNNN5OfnM378+NZtSkpKeOaZZygoKOj4hVS/iEgE\n2LYNcnOhqMjpJMHp0fqlvLyc0aNHk5iYSHR0NDk5Obz66qtXbKdhLSK2cPPZpNDJUK+vrychIaF1\nPT4+nvr6+jbbREVFsXPnTnw+H5mZmVRVVYUnqcNs7hVtzg7K7zS35XfziUcAfTt6MCoqqtMnmDx5\nMrW1tfTr14+ioiKys7M5ePBgu9suWrSIxMREAGJiYkhNTSUjIwP44o2P1PXKysqIyqN1rWs9tPVj\nx6ClpYSSksjIc/l6SUkJGzduBGidl13RYadeVlbGT37yE4qLiwFYs2YNffr0YeXKlVd9whEjRrB7\n926uvfbati+kTl1EIsB//Af8+78Hrqdugx7t1NPS0jh06BA1NTWcO3eOLVu2kJWV1WabhoaG1hcs\nLy/HGHPFQBcRiRRuP/qlw6Het29fcnNzmTlzJsnJydx5552MHz+evLw88vLyANi6dSspKSmkpqay\nYsUKNm/e3CvBe9vFX49sZHN2UH6nuS1/Q4OHO3WAWbNmMWvWrDb3LV26tPW/ly1bxrJly3o+mYhI\nD2tuhvp6iItzOkn46DIBIuIZBw/CzJlQXe10kuDpMgEiIldRWQmpqU6nCC8N9SDZ3CvanB2U32lu\nyq+hLiLiInv3gs/ndIrwUqcuIp4RFwfvvAMhnNPjGHXqIiLt+PhjaGqCG25wOkl4aagHyeZe0ebs\noPxOc0v+i9VLEFc/sZqGuoh4ghf6dFCnLiIesWABTJsGixc7naRr1KmLiLTDC4czgoZ60GzuFW3O\nDsrvNDfkP3sWDh+G5GSn04SfhrqIuF5VFYweDV/5itNJwk+duoi43gsvwJ/+BC+95HSSrlOnLiJy\nGa/06aChHjSbe0Wbs4PyO80N+b1yOCNoqIuIyxkT2FP3ylBXpy4irlZTA//2b4Evx7CROnURkUt4\nqXoBDfWg2dwr2pwdlN9ptuf/3e9KPPMhKWioi4jLHTnirT11deoi4mojR0JREYwd63SS0HR1dmqo\n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\n0tI2j0dy/gsXLrBnzx4eeugh9uzZQ//+/XnyySfbbBPJ+S86d+4cf/jDH7jjjjuueCyY/GEd6sGc\nvGSD2NhYjh07BsDRo0cZ2tHXrESA8+fPM3fuXBYsWEB2djZg388AMGjQIG6//XZ2795tRf6dO3dS\nUFDAiBEjmD9/Pm+++SYLFiywIvtFw4cPB2DIkCHMmTOH8vJya/LHx8cTHx/PTTfdBMC8efPYs2cP\nw4YNsyL/RUVFRdx4440MGTIE6Prf3bAO9UtPXjp37hxbtmwhKysrnC8ZFllZWa1npG3atKl1UEYi\nYwxLliwhOTmZFStWtN5vy89w/Pjx1k/3z5w5wxtvvIHf77ci/+rVq6mtraW6uprNmzfzrW99i9/8\n5jdWZAf49NNPOXXqFABNTU28/vrrpKSkWJN/2LBhJCQkcPDgQQC2b9/OhAkTmD17thX5L8rPz2+t\nXiCEv7th7vtNYWGhGTNmjBk1apRZvXp1uF+u23Jycszw4cNNdHS0iY+PNxs2bDAnTpww06dPN0lJ\nSWbGjBnmn//8p9Mxr6q0tNRERUUZn89nUlNTTWpqqikqKrLmZ9i3b5/x+/3G5/OZlJQU8/Of/9wY\nY6zJf1FJSUnr0S+2ZP/b3/5mfD6f8fl8ZsKECa1/X23Jb4wxlZWVJi0tzUyaNMnMmTPHNDY2WpX/\n9OnT5rrrrjMnT55sva+r+XXykYiIi+jr7EREXERDXUTERTTURURcRENdRMRFNNRFRFxEQ11ExEU0\n1EVEXERDXUTERf4f9riRCbgonPsAAAAASUVORK5CYII=\n", "text": [ "" ] } ], "prompt_number": 70 }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "Wheat and Chessboard w/ NumPy" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "http://docs.scipy.org/doc/numpy/reference/ufuncs.html" ] }, { "cell_type": "code", "collapsed": false, "input": [ "# http://docs.scipy.org/doc/numpy/reference/generated/numpy.ones.html\n", "from numpy import ones" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 71 }, { "cell_type": "code", "collapsed": false, "input": [ "2*ones(64, dtype=np.int)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 72, "text": [ "array([2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\n", " 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\n", " 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2])" ] } ], "prompt_number": 72 }, { "cell_type": "code", "collapsed": false, "input": [ "arange(64)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 73, "text": [ "array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,\n", " 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33,\n", " 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50,\n", " 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63])" ] } ], "prompt_number": 73 }, { "cell_type": "code", "collapsed": false, "input": [ "sum(np.power(2, arange(64, dtype=np.uint64)))" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 74, "text": [ "1.8446744073709552e+19" ] } ], "prompt_number": 74 }, { "cell_type": "code", "collapsed": false, "input": [ "sum(np.power(2*ones(64, dtype=np.uint64), arange(64))) " ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 75, "text": [ "1.8446744073709552e+19" ] } ], "prompt_number": 75 }, { "cell_type": "code", "collapsed": false, "input": [ "precise_ans = sum([pow(2,n) for n in xrange(64)])\n", "np_ans = sum(np.power(2*ones(64, dtype=np.uint64), arange(64)))\n", "\n", "precise_ans, np_ans\n", "\n" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 76, "text": [ "(18446744073709551615L, 1.8446744073709552e+19)" ] } ], "prompt_number": 76 }, { "cell_type": "code", "collapsed": false, "input": [ "# Raise an assertion if two items are not equal up to desired precision.\n", "np.testing.assert_almost_equal(precise_ans, np_ans) is None" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 77, "text": [ "True" ] } ], "prompt_number": 77 }, { "cell_type": "heading", "level": 1, "metadata": {}, "source": [ "DataFrame" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "so many ways to use DataFrames....let's try them out in context of the census calculations" ] }, { "cell_type": "code", "collapsed": false, "input": [ "# not really intuitive to me: reversal of column/row\n", "DataFrame(dict([('06', {'name': 'California', 'abbreviation':'CA'})] ))" ], "language": "python", "metadata": {}, "outputs": [ { "html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
06
abbreviation CA
name California
\n", "
" ], "metadata": {}, "output_type": "pyout", "prompt_number": 78, "text": [ " 06\n", "abbreviation CA\n", "name California" ] } ], "prompt_number": 78 }, { "cell_type": "code", "collapsed": false, "input": [ "DataFrame([{'name': 'California', 'abbreviation':'CA'}], index= ['06'])" ], "language": "python", "metadata": {}, "outputs": [ { "html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
abbreviationname
06 CA California
\n", "
" ], "metadata": {}, "output_type": "pyout", "prompt_number": 79, "text": [ " abbreviation name\n", "06 CA California" ] } ], "prompt_number": 79 }, { "cell_type": "code", "collapsed": false, "input": [ "Series(['06'], name='FIPS')" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 80, "text": [ "0 06\n", "Name: FIPS, dtype: object" ] } ], "prompt_number": 80 }, { "cell_type": "code", "collapsed": false, "input": [ "DataFrame([{'name': 'California', 'abbreviation':'CA'}], \n", " index=Series(['06'], name='FIPS'))" ], "language": "python", "metadata": {}, "outputs": [ { "html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
abbreviationname
FIPS
06 CA California
\n", "
" ], "metadata": {}, "output_type": "pyout", "prompt_number": 81, "text": [ " abbreviation name\n", "FIPS \n", "06 CA California" ] } ], "prompt_number": 81 }, { "cell_type": "heading", "level": 1, "metadata": {}, "source": [ "Advanced: Operator Overloading" ] }, { "cell_type": "code", "collapsed": false, "input": [ "n0 = 5\n", "n0 == 5" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 82, "text": [ "True" ] } ], "prompt_number": 82 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now I thought I'd be able to use a `n0.__eq__(5)` but nope -- it's complicated -- see http://stackoverflow.com/questions/2281222/why-when-in-python-does-x-y-call-y-eq-x#comment2254663_2282795" ] }, { "cell_type": "code", "collapsed": false, "input": [ "try:\n", " n0.__eq__(5)\n", "except Exception as e:\n", " print e" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "'int' object has no attribute '__eq__'\n" ] } ], "prompt_number": 83 }, { "cell_type": "markdown", "metadata": {}, "source": [ "can do: `int.__cmp__(x)`" ] }, { "cell_type": "code", "collapsed": false, "input": [ "(n0.__cmp__(4), n0.__cmp__(5), n0.__cmp__(6))" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 84, "text": [ "(1, 0, -1)" ] } ], "prompt_number": 84 }, { "cell_type": "markdown", "metadata": {}, "source": [ "how about ndarray?" ] }, { "cell_type": "code", "collapsed": false, "input": [ "arange(5) == 2 " ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 85, "text": [ "array([False, False, True, False, False], dtype=bool)" ] } ], "prompt_number": 85 }, { "cell_type": "code", "collapsed": false, "input": [ "# \n", "# http://docs.scipy.org/doc/numpy/reference/generated/numpy.array_equal.html\n", "np.array_equal(arange(5) == 2 , arange(5).__eq__(2))" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 86, "text": [ "True" ] } ], "prompt_number": 86 }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "Appendix: underlying mechanics of slicing" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Useful if you want to understand how the slicing syntax really works." ] }, { "cell_type": "code", "collapsed": false, "input": [ "isinstance([1,2], list)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 87, "text": [ "True" ] } ], "prompt_number": 87 }, { "cell_type": "code", "collapsed": false, "input": [ "isinstance(arange(5), list) # what does that mean -- could still be list-like" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 88, "text": [ "False" ] } ], "prompt_number": 88 }, { "cell_type": "code", "collapsed": false, "input": [ "l1 = range(5)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 89 }, { "cell_type": "code", "collapsed": false, "input": [ "type(l1)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 90, "text": [ "list" ] } ], "prompt_number": 90 }, { "cell_type": "code", "collapsed": false, "input": [ "l1[0], l1.__getitem__(0), l1[0] == l1.__getitem__(0)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 91, "text": [ "(0, 0, True)" ] } ], "prompt_number": 91 }, { "cell_type": "code", "collapsed": false, "input": [ "l1[::-1], l1.__getitem__(slice(None, None, -1))" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 92, "text": [ "([4, 3, 2, 1, 0], [4, 3, 2, 1, 0])" ] } ], "prompt_number": 92 }, { "cell_type": "code", "collapsed": false, "input": [ "ar1 = arange(5)\n", "ar1[3], ar1.__getitem__(3)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 93, "text": [ "(3, 3)" ] } ], "prompt_number": 93 }, { "cell_type": "code", "collapsed": false, "input": [ "ar1 == 2" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 94, "text": [ "array([False, False, True, False, False], dtype=bool)" ] } ], "prompt_number": 94 }, { "cell_type": "code", "collapsed": false, "input": [ "ar1[ar1 == 2].shape" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 95, "text": [ "(1,)" ] } ], "prompt_number": 95 }, { "cell_type": "code", "collapsed": false, "input": [ "ar1.__eq__(2)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 96, "text": [ "array([False, False, True, False, False], dtype=bool)" ] } ], "prompt_number": 96 }, { "cell_type": "code", "collapsed": false, "input": [ "ar1.__getitem__(slice(2, 4, None))" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 97, "text": [ "array([2, 3])" ] } ], "prompt_number": 97 }, { "cell_type": "code", "collapsed": false, "input": [ "slice(ar1.__eq__(2), None, None)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 98, "text": [ "slice(array([False, False, True, False, False], dtype=bool), None, None)" ] } ], "prompt_number": 98 }, { "cell_type": "code", "collapsed": false, "input": [ "ar1.__getitem__(ar1.__eq__(2))" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 99, "text": [ "array([2])" ] } ], "prompt_number": 99 }, { "cell_type": "code", "collapsed": false, "input": [ "ar1[:2], ar1.__getitem__(slice(2))" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 100, "text": [ "(array([0, 1]), array([0, 1]))" ] } ], "prompt_number": 100 }, { "cell_type": "code", "collapsed": false, "input": [ "ar1 + 7" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 101, "text": [ "array([ 7, 8, 9, 10, 11])" ] } ], "prompt_number": 101 }, { "cell_type": "code", "collapsed": false, "input": [ "ar1.__add__(7)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 102, "text": [ "array([ 7, 8, 9, 10, 11])" ] } ], "prompt_number": 102 }, { "cell_type": "code", "collapsed": false, "input": [ "min(ar1 + 7)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 103, "text": [ "7" ] } ], "prompt_number": 103 }, { "cell_type": "code", "collapsed": false, "input": [ "alphabet[:]" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 104, "text": [ "'abcdefghijklmnopqrstuvwxyz'" ] } ], "prompt_number": 104 } ], "metadata": {} } ] }