{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# 02 - Introduction to Python for Data Analysis\n", "\n", "by [Alejandro Correa Bahnsen](albahnsen.com/)\n", "\n", "version 0.2, May 2016\n", "\n", "## Part of the class [Machine Learning for Security Informatics](https://github.com/albahnsen/ML_SecurityInformatics)\n", "\n", "\n", "This notebook is licensed under a [Creative Commons Attribution-ShareAlike 3.0 Unported License](http://creativecommons.org/licenses/by-sa/3.0/deed.en_US). Special thanks goes to [Rick Muller](http://www.cs.sandia.gov/~rmuller/), Sandia National Laboratories" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Why Python?\n", "Python is the programming language of choice for many scientists to a large degree because it offers a great deal of power to analyze and model scientific data with relatively little overhead in terms of learning, installation or development time. It is a language you can pick up in a weekend, and use for the rest of one's life.\n", "\n", "The [Python Tutorial](http://docs.python.org/3/tutorial/) is a great place to start getting a feel for the language. To complement this material, I taught a [Python Short Course](http://www.wag.caltech.edu/home/rpm/python_course/) years ago to a group of computational chemists during a time that I was worried the field was moving too much in the direction of using canned software rather than developing one's own methods. I wanted to focus on what working scientists needed to be more productive: parsing output of other programs, building simple models, experimenting with object oriented programming, extending the language with C, and simple GUIs. \n", "\n", "I'm trying to do something very similar here, to cut to the chase and focus on what scientists need. In the last year or so, the [Jupyter Project](http://jupyter.org) has put together a notebook interface that I have found incredibly valuable. A large number of people have released very good IPython Notebooks that I have taken a huge amount of pleasure reading through. Some ones that I particularly like include:\n", "\n", "* Rick Muller [A Crash Course in Python for Scientists](http://nbviewer.jupyter.org/gist/rpmuller/5920182)\n", "* Rob Johansson's [excellent notebooks](http://jrjohansson.github.io/), including [Scientific Computing with Python](https://github.com/jrjohansson/scientific-python-lectures) and [Computational Quantum Physics with QuTiP](https://github.com/jrjohansson/qutip-lectures) lectures;\n", "* [XKCD style graphs in matplotlib](http://nbviewer.ipython.org/url/jakevdp.github.com/downloads/notebooks/XKCD_plots.ipynb);\n", "* [A collection of Notebooks for using IPython effectively](https://github.com/ipython/ipython/tree/master/examples/notebooks#a-collection-of-notebooks-for-using-ipython-effectively)\n", "* [A gallery of interesting IPython Notebooks](https://github.com/ipython/ipython/wiki/A-gallery-of-interesting-IPython-Notebooks)\n", "\n", "I find Jupyter notebooks an easy way both to get important work done in my everyday job, as well as to communicate what I've done, how I've done it, and why it matters to my coworkers. In the interest of putting more notebooks out into the wild for other people to use and enjoy, I thought I would try to recreate some of what I was trying to get across in the original Python Short Course, updated by 15 years of Python, Numpy, Scipy, Pandas, Matplotlib, and IPython development, as well as my own experience in using Python almost every day of this time." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Why Python for Data Analysis?\n", "\n", "- Python is great for scripting and applications.\n", "- The `pandas` library offers imporved library support.\n", "- Scraping, web APIs\n", "- Strong High Performance Computation support\n", " - Load balanceing tasks\n", " - MPI, GPU\n", " - MapReduce\n", "- Strong support for abstraction\n", " - Intel MKL\n", " - HDF5\n", "- Environment" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## But we already know R\n", "\n", "...Which is better? Hard to answer\n", "\n", "http://www.kdnuggets.com/2015/05/r-vs-python-data-science.html\n", "\n", "http://www.kdnuggets.com/2015/03/the-grammar-data-science-python-vs-r.html\n", "\n", "https://www.datacamp.com/community/tutorials/r-or-python-for-data-analysis\n", "\n", "https://www.dataquest.io/blog/python-vs-r/\n", "\n", "http://www.dataschool.io/python-or-r-for-data-science/" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## What You Need to Install\n", "\n", "There are two branches of current releases in Python: the older-syntax Python 2, and the newer-syntax Python 3. This schizophrenia is largely intentional: when it became clear that some non-backwards-compatible changes to the language were necessary, the Python dev-team decided to go through a five-year (or so) transition, during which the new language features would be introduced and the old language was still actively maintained, to make such a transition as easy as possible. \n", "\n", "Nonetheless, I'm going to write these notes with Python 3 in mind, since this is the version of the language that I use in my day-to-day job, and am most comfortable with. \n", "\n", "With this in mind, these notes assume you have a Python distribution that includes:\n", "\n", "* [Python](http://www.python.org) version 3.5;\n", "* [Numpy](http://www.numpy.org), the core numerical extensions for linear algebra and multidimensional arrays;\n", "* [Scipy](http://www.scipy.org), additional libraries for scientific programming;\n", "* [Matplotlib](http://matplotlib.sf.net), excellent plotting and graphing libraries;\n", "* [IPython](http://ipython.org), with the additional libraries required for the notebook interface.\n", "* [Pandas](http://pandas.pydata.org/), Python version of R dataframe\n", "* [scikit-learn](http://scikit-learn.org), Machine learning library!\n", "\n", "A good, easy to install option that supports Mac, Windows, and Linux, and that has all of these packages (and much more) is the [Anaconda](https://www.continuum.io/)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Checking your installation\n", "\n", "You can run the following code to check the versions of the packages on your system:\n", "\n", "(in IPython notebook, press `shift` and `return` together to execute the contents of a cell)" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Python version: 3.5.1 |Anaconda custom (64-bit)| (default, Dec 7 2015, 11:16:01) \n", "[GCC 4.4.7 20120313 (Red Hat 4.4.7-1)]\n", "IPython: 4.0.3\n", "numpy: 1.10.4\n", "scipy: 0.17.0\n", "matplotlib: 1.5.1\n", "pandas: 0.17.1\n", "scikit-learn: 0.17.1\n" ] } ], "source": [ "import sys\n", "\n", "print('Python version:', sys.version)\n", "\n", "import IPython\n", "print('IPython:', IPython.__version__)\n", "\n", "import numpy\n", "print('numpy:', numpy.__version__)\n", "\n", "import scipy\n", "print('scipy:', scipy.__version__)\n", "\n", "import matplotlib\n", "print('matplotlib:', matplotlib.__version__)\n", "\n", "import pandas\n", "print('pandas:', pandas.__version__)\n", "\n", "import sklearn\n", "print('scikit-learn:', sklearn.__version__)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# I. Python Overview\n", "This is a quick introduction to Python. There are lots of other places to learn the language more thoroughly. I have collected a list of useful links, including ones to other learning resources, at the end of this notebook. If you want a little more depth, [Python Tutorial](http://docs.python.org/2/tutorial/) is a great place to start, as is Zed Shaw's [Learn Python the Hard Way](http://learnpythonthehardway.org/book/).\n", "\n", "The lessons that follow make use of the IPython notebooks. There's a good introduction to notebooks [in the IPython notebook documentation](http://ipython.org/notebook.html) that even has a [nice video](http://www.youtube.com/watch?v=H6dLGQw9yFQ#!) on how to use the notebooks. You should probably also flip through the [IPython tutorial](http://ipython.org/ipython-doc/dev/interactive/tutorial.html) in your copious free time.\n", "\n", "Briefly, notebooks have code cells (that are generally followed by result cells) and text cells. The text cells are the stuff that you're reading now. The code cells start with \"In []:\" with some number generally in the brackets. If you put your cursor in the code cell and hit Shift-Enter, the code will run in the Python interpreter and the result will print out in the output cell. You can then change things around and see whether you understand what's going on. If you need to know more, see the [IPython notebook documentation](http://ipython.org/notebook.html) or the [IPython tutorial](http://ipython.org/ipython-doc/dev/interactive/tutorial.html)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Using Python as a Calculator" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Many of the things I used to use a calculator for, I now use Python for:" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "4" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "2+2" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "5.0" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "(50-5*6)/4" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "(If you're typing this into an IPython notebook, or otherwise using notebook file, you hit shift-Enter to evaluate a cell.)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In the last few lines, we have sped by a lot of things that we should stop for a moment and explore a little more fully. We've seen, however briefly, two different data types: **integers**, also known as *whole numbers* to the non-programming world, and **floating point numbers**, also known (incorrectly) as *decimal numbers* to the rest of the world.\n", "\n", "We've also seen the first instance of an **import** statement. Python has a huge number of libraries included with the distribution. To keep things simple, most of these variables and functions are not accessible from a normal Python interactive session. Instead, you have to import the name. For example, there is a **math** module containing many useful functions. To access, say, the square root function, you can either first\n", "\n", " from math import sqrt\n", "\n", "and then" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false }, "outputs": [ { "ename": "NameError", "evalue": "name 'sqrt' is not defined", "output_type": "error", "traceback": [ "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[1;31mNameError\u001b[0m Traceback (most recent call last)", "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m()\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0msqrt\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m81\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[1;31mNameError\u001b[0m: name 'sqrt' is not defined" ] } ], "source": [ "sqrt(81)" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "9.0" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from math import sqrt\n", "sqrt(81)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "or you can simply import the math library itself" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "9.0" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import math\n", "math.sqrt(81)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You can define variables using the equals (=) sign:" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "1256.6370614359173" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "radius = 20\n", "pi = math.pi\n", "area = pi * radius ** 2 \n", "area" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "If you try to access a variable that you haven't yet defined, you get an error:" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": false }, "outputs": [ { "ename": "NameError", "evalue": "name 'volume' is not defined", "output_type": "error", "traceback": [ "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[1;31mNameError\u001b[0m Traceback (most recent call last)", "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m()\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0mvolume\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[1;31mNameError\u001b[0m: name 'volume' is not defined" ] } ], "source": [ "volume" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "and you need to define it:" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "33510.32163829113" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "volume = 4/3*pi*radius**3\n", "volume" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You can name a variable *almost* anything you want. It needs to start with an alphabetical character or \"\\_\", can contain alphanumeric charcters plus underscores (\"\\_\"). Certain words, however, are reserved for the language:\n", "\n", " and, as, assert, break, class, continue, def, del, elif, else, except, \n", " exec, finally, for, from, global, if, import, in, is, lambda, not, or,\n", " pass, print, raise, return, try, while, with, yield\n", "\n", "Trying to define a variable using one of these will result in a syntax error:" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "collapsed": false }, "outputs": [ { "ename": "SyntaxError", "evalue": "invalid syntax (, line 1)", "output_type": "error", "traceback": [ "\u001b[1;36m File \u001b[1;32m\"\"\u001b[1;36m, line \u001b[1;32m1\u001b[0m\n\u001b[1;33m return = 0\u001b[0m\n\u001b[1;37m ^\u001b[0m\n\u001b[1;31mSyntaxError\u001b[0m\u001b[1;31m:\u001b[0m invalid syntax\n" ] } ], "source": [ "return = 0" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The [Python Tutorial](http://docs.python.org/2/tutorial/introduction.html#using-python-as-a-calculator) has more on using Python as an interactive shell. The [IPython tutorial](http://ipython.org/ipython-doc/dev/interactive/tutorial.html) makes a nice complement to this, since IPython has a much more sophisticated iteractive shell." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Strings\n", "Strings are lists of printable characters, and can be defined using either single quotes" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "'Hello, World!'" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "'Hello, World!'" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "or double quotes" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "'Hello, World!'" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "\"Hello, World!\"" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "But not both at the same time, unless you want one of the symbols to be part of the string." ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "\"He's a Rebel\"" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "\"He's a Rebel\"" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "'She asked, \"How are you today?\"'" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "'She asked, \"How are you today?\"'" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Just like the other two data objects we're familiar with (ints and floats), you can assign a string to a variable" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "collapsed": false }, "outputs": [], "source": [ "greeting = \"Hello, World!\"" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The **print** statement is often used for printing character strings:" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Hello, World!\n" ] } ], "source": [ "print(greeting)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "But it can also print data types other than strings:" ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "collapsed": false }, "outputs": [ { "ename": "TypeError", "evalue": "Can't convert 'float' object to str implicitly", "output_type": "error", "traceback": [ "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[1;31mTypeError\u001b[0m Traceback (most recent call last)", "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m()\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0mprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m\"The area is \"\u001b[0m \u001b[1;33m+\u001b[0m \u001b[0marea\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[1;31mTypeError\u001b[0m: Can't convert 'float' object to str implicitly" ] } ], "source": [ "print(\"The area is \" + area)" ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "The area is 1256.6370614359173\n" ] } ], "source": [ "print(\"The area is \" + str(area))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In the above snipped, the number 600 (stored in the variable \"area\") is converted into a string before being printed out." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You can use the + operator to concatenate strings together:" ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Hello,World!\n" ] } ], "source": [ "statement = \"Hello,\" + \"World!\"\n", "print(statement)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Don't forget the space between the strings, if you want one there. " ] }, { "cell_type": "code", "execution_count": 20, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Hello, World!\n" ] } ], "source": [ "statement = \"Hello, \" + \"World!\"\n", "print(statement)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You can use + to concatenate multiple strings in a single statement:" ] }, { "cell_type": "code", "execution_count": 21, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "This is a longer statement.\n" ] } ], "source": [ "print(\"This \" + \"is \" + \"a \" + \"longer \" + \"statement.\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "If you have a lot of words to concatenate together, there are other, more efficient ways to do this. But this is fine for linking a few strings together." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Lists\n", "Very often in a programming language, one wants to keep a group of similar items together. Python does this using a data type called **lists**." ] }, { "cell_type": "code", "execution_count": 22, "metadata": { "collapsed": false }, "outputs": [], "source": [ "days_of_the_week = [\"Sunday\",\"Monday\",\"Tuesday\",\"Wednesday\",\"Thursday\",\"Friday\",\"Saturday\"]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You can access members of the list using the **index** of that item:" ] }, { "cell_type": "code", "execution_count": 23, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "'Tuesday'" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "days_of_the_week[2]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Python lists, like C, but unlike Fortran, use 0 as the index of the first element of a list. Thus, in this example, the 0 element is \"Sunday\", 1 is \"Monday\", and so on. If you need to access the *n*th element from the end of the list, you can use a negative index. For example, the -1 element of a list is the last element:" ] }, { "cell_type": "code", "execution_count": 24, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "'Saturday'" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "days_of_the_week[-1]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You can add additional items to the list using the .append() command:" ] }, { "cell_type": "code", "execution_count": 25, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "['Fortran', 'C', 'C++', 'Python']\n" ] } ], "source": [ "languages = [\"Fortran\",\"C\",\"C++\"]\n", "languages.append(\"Python\")\n", "print(languages)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The **range()** command is a convenient way to make sequential lists of numbers:" ] }, { "cell_type": "code", "execution_count": 26, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]" ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ "list(range(10))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Note that range(n) starts at 0 and gives the sequential list of integers less than n. If you want to start at a different number, use range(start,stop)" ] }, { "cell_type": "code", "execution_count": 27, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "[2, 3, 4, 5, 6, 7]" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "list(range(2,8))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The lists created above with range have a *step* of 1 between elements. You can also give a fixed step size via a third command:" ] }, { "cell_type": "code", "execution_count": 28, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]" ] }, "execution_count": 28, "metadata": {}, "output_type": "execute_result" } ], "source": [ "evens = list(range(0,20,2))\n", "evens" ] }, { "cell_type": "code", "execution_count": 29, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "6" ] }, "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], "source": [ "evens[3]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Lists do not have to hold the same data type. For example," ] }, { "cell_type": "code", "execution_count": 30, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "['Today', 7, 99.3, '']" ] }, "execution_count": 30, "metadata": {}, "output_type": "execute_result" } ], "source": [ "[\"Today\",7,99.3,\"\"]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "However, it's good (but not essential) to use lists for similar objects that are somehow logically connected. If you want to group different data types together into a composite data object, it's best to use **tuples**, which we will learn about below.\n", "\n", "You can find out how long a list is using the **len()** command:" ] }, { "cell_type": "code", "execution_count": 31, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Help on built-in function len in module builtins:\n", "\n", "len(obj, /)\n", " Return the number of items in a container.\n", "\n" ] } ], "source": [ "help(len)" ] }, { "cell_type": "code", "execution_count": 32, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "10" ] }, "execution_count": 32, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(evens)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Iteration, Indentation, and Blocks\n", "One of the most useful things you can do with lists is to *iterate* through them, i.e. to go through each element one at a time. To do this in Python, we use the **for** statement:" ] }, { "cell_type": "code", "execution_count": 33, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Sunday\n", "Monday\n", "Tuesday\n", "Wednesday\n", "Thursday\n", "Friday\n", "Saturday\n" ] } ], "source": [ "for day in days_of_the_week:\n", " print(day)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This code snippet goes through each element of the list called **days_of_the_week** and assigns it to the variable **day**. It then executes everything in the indented block (in this case only one line of code, the print statement) using those variable assignments. When the program has gone through every element of the list, it exists the block.\n", "\n", "(Almost) every programming language defines blocks of code in some way. In Fortran, one uses END statements (ENDDO, ENDIF, etc.) to define code blocks. In C, C++, and Perl, one uses curly braces {} to define these blocks.\n", "\n", "Python uses a colon (\":\"), followed by indentation level to define code blocks. Everything at a higher level of indentation is taken to be in the same block. In the above example the block was only a single line, but we could have had longer blocks as well:" ] }, { "cell_type": "code", "execution_count": 34, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Today is Sunday\n", "Today is Monday\n", "Today is Tuesday\n", "Today is Wednesday\n", "Today is Thursday\n", "Today is Friday\n", "Today is Saturday\n" ] } ], "source": [ "for day in days_of_the_week:\n", " statement = \"Today is \" + day\n", " print(statement)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The **range()** command is particularly useful with the **for** statement to execute loops of a specified length:" ] }, { "cell_type": "code", "execution_count": 35, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "The square of 0 is 0\n", "The square of 1 is 1\n", "The square of 2 is 4\n", "The square of 3 is 9\n", "The square of 4 is 16\n", "The square of 5 is 25\n", "The square of 6 is 36\n", "The square of 7 is 49\n", "The square of 8 is 64\n", "The square of 9 is 81\n", "The square of 10 is 100\n", "The square of 11 is 121\n", "The square of 12 is 144\n", "The square of 13 is 169\n", "The square of 14 is 196\n", "The square of 15 is 225\n", "The square of 16 is 256\n", "The square of 17 is 289\n", "The square of 18 is 324\n", "The square of 19 is 361\n" ] } ], "source": [ "for i in range(20):\n", " print(\"The square of \",i,\" is \",i*i)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Slicing\n", "Lists and strings have something in common that you might not suspect: they can both be treated as sequences. You already know that you can iterate through the elements of a list. You can also iterate through the letters in a string:" ] }, { "cell_type": "code", "execution_count": 36, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "S\n", "u\n", "n\n", "d\n", "a\n", "y\n" ] } ], "source": [ "for letter in \"Sunday\":\n", " print(letter)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This is only occasionally useful. Slightly more useful is the *slicing* operation, which you can also use on any sequence. We already know that we can use *indexing* to get the first element of a list:" ] }, { "cell_type": "code", "execution_count": 37, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "'Sunday'" ] }, "execution_count": 37, "metadata": {}, "output_type": "execute_result" } ], "source": [ "days_of_the_week[0]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "If we want the list containing the first two elements of a list, we can do this via" ] }, { "cell_type": "code", "execution_count": 38, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "['Sunday', 'Monday']" ] }, "execution_count": 38, "metadata": {}, "output_type": "execute_result" } ], "source": [ "days_of_the_week[0:2]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "or simply" ] }, { "cell_type": "code", "execution_count": 39, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "['Sunday', 'Monday']" ] }, "execution_count": 39, "metadata": {}, "output_type": "execute_result" } ], "source": [ "days_of_the_week[:2]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "If we want the last items of the list, we can do this with negative slicing:" ] }, { "cell_type": "code", "execution_count": 40, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "['Friday', 'Saturday']" ] }, "execution_count": 40, "metadata": {}, "output_type": "execute_result" } ], "source": [ "days_of_the_week[-2:]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "which is somewhat logically consistent with negative indices accessing the last elements of the list.\n", "\n", "You can do:" ] }, { "cell_type": "code", "execution_count": 41, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']\n" ] } ], "source": [ "workdays = days_of_the_week[1:6]\n", "print(workdays)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Since strings are sequences, you can also do this to them:" ] }, { "cell_type": "code", "execution_count": 42, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Sun\n" ] } ], "source": [ "day = \"Sunday\"\n", "abbreviation = day[:3]\n", "print(abbreviation)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "If we really want to get fancy, we can pass a third element into the slice, which specifies a step length (just like a third argument to the **range()** function specifies the step):" ] }, { "cell_type": "code", "execution_count": 43, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38]" ] }, "execution_count": 43, "metadata": {}, "output_type": "execute_result" } ], "source": [ "numbers = list(range(0,40))\n", "evens = numbers[2::2]\n", "evens" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Note that in this example I was even able to omit the second argument, so that the slice started at 2, went to the end of the list, and took every second element, to generate the list of even numbers less that 40." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Booleans and Truth Testing\n", "We have now learned a few data types. We have integers and floating point numbers, strings, and lists to contain them. We have also learned about lists, a container that can hold any data type. We have learned to print things out, and to iterate over items in lists. We will now learn about **boolean** variables that can be either True or False.\n", "\n", "We invariably need some concept of *conditions* in programming to control branching behavior, to allow a program to react differently to different situations. If it's Monday, I'll go to work, but if it's Sunday, I'll sleep in. To do this in Python, we use a combination of **boolean** variables, which evaluate to either True or False, and **if** statements, that control branching based on boolean values." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "For example:" ] }, { "cell_type": "code", "execution_count": 44, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Sleep in\n" ] } ], "source": [ "if day == \"Sunday\":\n", " print(\"Sleep in\")\n", "else:\n", " print(\"Go to work\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "(Quick quiz: why did the snippet print \"Go to work\" here? What is the variable \"day\" set to?)\n", "\n", "Let's take the snippet apart to see what happened. First, note the statement" ] }, { "cell_type": "code", "execution_count": 45, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 45, "metadata": {}, "output_type": "execute_result" } ], "source": [ "day == \"Sunday\"" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "If we evaluate it by itself, as we just did, we see that it returns a boolean value, False. The \"==\" operator performs *equality testing*. If the two items are equal, it returns True, otherwise it returns False. In this case, it is comparing two variables, the string \"Sunday\", and whatever is stored in the variable \"day\", which, in this case, is the other string \"Saturday\". Since the two strings are not equal to each other, the truth test has the false value." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The if statement that contains the truth test is followed by a code block (a colon followed by an indented block of code). If the boolean is true, it executes the code in that block. Since it is false in the above example, we don't see that code executed.\n", "\n", "The first block of code is followed by an **else** statement, which is executed if nothing else in the above if statement is true. Since the value was false, this code is executed, which is why we see \"Go to work\".\n", "\n", "You can compare any data types in Python:" ] }, { "cell_type": "code", "execution_count": 46, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "False" ] }, "execution_count": 46, "metadata": {}, "output_type": "execute_result" } ], "source": [ "1 == 2" ] }, { "cell_type": "code", "execution_count": 47, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 47, "metadata": {}, "output_type": "execute_result" } ], "source": [ "50 == 2*25" ] }, { "cell_type": "code", "execution_count": 48, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 48, "metadata": {}, "output_type": "execute_result" } ], "source": [ "3 < 3.14159" ] }, { "cell_type": "code", "execution_count": 49, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 49, "metadata": {}, "output_type": "execute_result" } ], "source": [ "1 == 1.0" ] }, { "cell_type": "code", "execution_count": 50, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 50, "metadata": {}, "output_type": "execute_result" } ], "source": [ "1 != 0" ] }, { "cell_type": "code", "execution_count": 51, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 51, "metadata": {}, "output_type": "execute_result" } ], "source": [ "1 <= 2" ] }, { "cell_type": "code", "execution_count": 52, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 52, "metadata": {}, "output_type": "execute_result" } ], "source": [ "1 >= 1" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We see a few other boolean operators here, all of which which should be self-explanatory. Less than, equality, non-equality, and so on.\n", "\n", "Particularly interesting is the 1 == 1.0 test, which is true, since even though the two objects are different data types (integer and floating point number), they have the same *value*. There is another boolean operator **is**, that tests whether two objects are the same object:" ] }, { "cell_type": "code", "execution_count": 53, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "False" ] }, "execution_count": 53, "metadata": {}, "output_type": "execute_result" } ], "source": [ "1 is 1.0" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can do boolean tests on lists as well:" ] }, { "cell_type": "code", "execution_count": 54, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "False" ] }, "execution_count": 54, "metadata": {}, "output_type": "execute_result" } ], "source": [ "[1,2,3] == [1,2,4]" ] }, { "cell_type": "code", "execution_count": 55, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 55, "metadata": {}, "output_type": "execute_result" } ], "source": [ "[1,2,3] < [1,2,4]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Finally, note that you can also string multiple comparisons together, which can result in very intuitive tests:" ] }, { "cell_type": "code", "execution_count": 56, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 56, "metadata": {}, "output_type": "execute_result" } ], "source": [ "hours = 5\n", "0 < hours < 24" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "If statements can have **elif** parts (\"else if\"), in addition to if/else parts. For example:" ] }, { "cell_type": "code", "execution_count": 57, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Sleep in\n" ] } ], "source": [ "if day == \"Sunday\":\n", " print(\"Sleep in\")\n", "elif day == \"Saturday\":\n", " print(\"Do chores\")\n", "else:\n", " print(\"Go to work\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Of course we can combine if statements with for loops, to make a snippet that is almost interesting:" ] }, { "cell_type": "code", "execution_count": 58, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Today is Sunday\n", " Sleep in\n", "Today is Monday\n", " Go to work\n", "Today is Tuesday\n", " Go to work\n", "Today is Wednesday\n", " Go to work\n", "Today is Thursday\n", " Go to work\n", "Today is Friday\n", " Go to work\n", "Today is Saturday\n", " Do chores\n" ] } ], "source": [ "for day in days_of_the_week:\n", " statement = \"Today is \" + day\n", " print(statement)\n", " if day == \"Sunday\":\n", " print(\" Sleep in\")\n", " elif day == \"Saturday\":\n", " print(\" Do chores\")\n", " else:\n", " print(\" Go to work\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This is something of an advanced topic, but ordinary data types have boolean values associated with them, and, indeed, in early versions of Python there was not a separate boolean object. Essentially, anything that was a 0 value (the integer or floating point 0, an empty string \"\", or an empty list []) was False, and everything else was true. You can see the boolean value of any data object using the **bool()** function." ] }, { "cell_type": "code", "execution_count": 59, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 59, "metadata": {}, "output_type": "execute_result" } ], "source": [ "bool(1)" ] }, { "cell_type": "code", "execution_count": 60, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "False" ] }, "execution_count": 60, "metadata": {}, "output_type": "execute_result" } ], "source": [ "bool(0)" ] }, { "cell_type": "code", "execution_count": 61, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 61, "metadata": {}, "output_type": "execute_result" } ], "source": [ "bool([\"This \",\" is \",\" a \",\" list\"])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Code Example: The Fibonacci Sequence\n", "The [Fibonacci sequence](http://en.wikipedia.org/wiki/Fibonacci_number) is a sequence in math that starts with 0 and 1, and then each successive entry is the sum of the previous two. Thus, the sequence goes 0,1,1,2,3,5,8,13,21,34,55,89,...\n", "\n", "A very common exercise in programming books is to compute the Fibonacci sequence up to some number **n**. First I'll show the code, then I'll discuss what it is doing." ] }, { "cell_type": "code", "execution_count": 62, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[0, 1, 1, 2, 3, 5, 8, 13, 21, 34]\n" ] } ], "source": [ "n = 10\n", "sequence = [0,1]\n", "for i in range(2,n): # This is going to be a problem if we ever set n <= 2!\n", " sequence.append(sequence[i-1]+sequence[i-2])\n", "print(sequence)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's go through this line by line. First, we define the variable **n**, and set it to the integer 20. **n** is the length of the sequence we're going to form, and should probably have a better variable name. We then create a variable called **sequence**, and initialize it to the list with the integers 0 and 1 in it, the first two elements of the Fibonacci sequence. We have to create these elements \"by hand\", since the iterative part of the sequence requires two previous elements.\n", "\n", "We then have a for loop over the list of integers from 2 (the next element of the list) to **n** (the length of the sequence). After the colon, we see a hash tag \"#\", and then a **comment** that if we had set **n** to some number less than 2 we would have a problem. Comments in Python start with #, and are good ways to make notes to yourself or to a user of your code explaining why you did what you did. Better than the comment here would be to test to make sure the value of **n** is valid, and to complain if it isn't; we'll try this later.\n", "\n", "In the body of the loop, we append to the list an integer equal to the sum of the two previous elements of the list.\n", "\n", "After exiting the loop (ending the indentation) we then print out the whole list. That's it!" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Functions\n", "We might want to use the Fibonacci snippet with different sequence lengths. We could cut an paste the code into another cell, changing the value of **n**, but it's easier and more useful to make a function out of the code. We do this with the **def** statement in Python:" ] }, { "cell_type": "code", "execution_count": 63, "metadata": { "collapsed": false }, "outputs": [], "source": [ "def fibonacci(sequence_length):\n", " \"Return the Fibonacci sequence of length *sequence_length*\"\n", " sequence = [0,1]\n", " if sequence_length < 1:\n", " print(\"Fibonacci sequence only defined for length 1 or greater\")\n", " return\n", " if 0 < sequence_length < 3:\n", " return sequence[:sequence_length]\n", " for i in range(2,sequence_length): \n", " sequence.append(sequence[i-1]+sequence[i-2])\n", " return sequence" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can now call **fibonacci()** for different sequence_lengths:" ] }, { "cell_type": "code", "execution_count": 64, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "[0, 1]" ] }, "execution_count": 64, "metadata": {}, "output_type": "execute_result" } ], "source": [ "fibonacci(2)" ] }, { "cell_type": "code", "execution_count": 65, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]" ] }, "execution_count": 65, "metadata": {}, "output_type": "execute_result" } ], "source": [ "fibonacci(12)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We've introduced a several new features here. First, note that the function itself is defined as a code block (a colon followed by an indented block). This is the standard way that Python delimits things. Next, note that the first line of the function is a single string. This is called a **docstring**, and is a special kind of comment that is often available to people using the function through the python command line:" ] }, { "cell_type": "code", "execution_count": 66, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Help on function fibonacci in module __main__:\n", "\n", "fibonacci(sequence_length)\n", " Return the Fibonacci sequence of length *sequence_length*\n", "\n" ] } ], "source": [ "help(fibonacci)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "If you define a docstring for all of your functions, it makes it easier for other people to use them, since they can get help on the arguments and return values of the function.\n", "\n", "Next, note that rather than putting a comment in about what input values lead to errors, we have some testing of these values, followed by a warning if the value is invalid, and some conditional code to handle special cases." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Two More Data Structures: Tuples and Dictionaries\n", "Before we end the Python overview, I wanted to touch on two more data structures that are very useful (and thus very common) in Python programs.\n", "\n", "A **tuple** is a sequence object like a list or a string. It's constructed by grouping a sequence of objects together with commas, either without brackets, or with parentheses:" ] }, { "cell_type": "code", "execution_count": 67, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "(1, 2, 'hi', 9.0)" ] }, "execution_count": 67, "metadata": {}, "output_type": "execute_result" } ], "source": [ "t = (1,2,'hi',9.0)\n", "t" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Tuples are like lists, in that you can access the elements using indices:" ] }, { "cell_type": "code", "execution_count": 68, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "2" ] }, "execution_count": 68, "metadata": {}, "output_type": "execute_result" } ], "source": [ "t[1]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "However, tuples are *immutable*, you can't append to them or change the elements of them:" ] }, { "cell_type": "code", "execution_count": 69, "metadata": { "collapsed": false }, "outputs": [ { "ename": "AttributeError", "evalue": "'tuple' object has no attribute 'append'", "output_type": "error", "traceback": [ "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[1;31mAttributeError\u001b[0m Traceback (most recent call last)", "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m()\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0mt\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mappend\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m7\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[1;31mAttributeError\u001b[0m: 'tuple' object has no attribute 'append'" ] } ], "source": [ "t.append(7)" ] }, { "cell_type": "code", "execution_count": 70, "metadata": { "collapsed": false }, "outputs": [ { "ename": "TypeError", "evalue": "'tuple' object does not support item assignment", "output_type": "error", "traceback": [ "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[1;31mTypeError\u001b[0m Traceback (most recent call last)", "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m()\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0mt\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;36m77\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[1;31mTypeError\u001b[0m: 'tuple' object does not support item assignment" ] } ], "source": [ "t[1]=77" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Tuples are useful anytime you want to group different pieces of data together in an object, but don't want to create a full-fledged class (see below) for them. For example, let's say you want the Cartesian coordinates of some objects in your program. Tuples are a good way to do this:" ] }, { "cell_type": "code", "execution_count": 71, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "('Bob', 0.0, 21.0)" ] }, "execution_count": 71, "metadata": {}, "output_type": "execute_result" } ], "source": [ "('Bob',0.0,21.0)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Again, it's not a necessary distinction, but one way to distinguish tuples and lists is that tuples are a collection of different things, here a name, and x and y coordinates, whereas a list is a collection of similar things, like if we wanted a list of those coordinates:" ] }, { "cell_type": "code", "execution_count": 72, "metadata": { "collapsed": false }, "outputs": [], "source": [ "positions = [\n", " ('Bob',0.0,21.0),\n", " ('Cat',2.5,13.1),\n", " ('Dog',33.0,1.2)\n", " ]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Tuples can be used when functions return more than one value. Say we wanted to compute the smallest x- and y-coordinates of the above list of objects. We could write:" ] }, { "cell_type": "code", "execution_count": 73, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0.0 1.2\n" ] } ], "source": [ "def minmax(objects):\n", " minx = 1e20 # These are set to really big numbers\n", " miny = 1e20\n", " for obj in objects:\n", " name,x,y = obj\n", " if x < minx: \n", " minx = x\n", " if y < miny:\n", " miny = y\n", " return minx,miny\n", "\n", "x,y = minmax(positions)\n", "print(x,y)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Dictionaries** are an object called \"mappings\" or \"associative arrays\" in other languages. Whereas a list associates an integer index with a set of objects:" ] }, { "cell_type": "code", "execution_count": 74, "metadata": { "collapsed": false }, "outputs": [], "source": [ "mylist = [1,2,9,21]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The index in a dictionary is called the *key*, and the corresponding dictionary entry is the *value*. A dictionary can use (almost) anything as the key. Whereas lists are formed with square brackets [], dictionaries use curly brackets {}:" ] }, { "cell_type": "code", "execution_count": 75, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Rick's age is 46\n" ] } ], "source": [ "ages = {\"Rick\": 46, \"Bob\": 86, \"Fred\": 21}\n", "print(\"Rick's age is \",ages[\"Rick\"])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "There's also a convenient way to create dictionaries without having to quote the keys." ] }, { "cell_type": "code", "execution_count": 76, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "{'Bob': 86, 'Fred': 20, 'Rick': 46}" ] }, "execution_count": 76, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dict(Rick=46,Bob=86,Fred=20)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The **len()** command works on both tuples and dictionaries:" ] }, { "cell_type": "code", "execution_count": 77, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "4" ] }, "execution_count": 77, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(t)" ] }, { "cell_type": "code", "execution_count": 78, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "3" ] }, "execution_count": 78, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(ages)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Conclusion of the Python Overview\n", "There is, of course, much more to the language than I've covered here. I've tried to keep this brief enough so that you can jump in and start using Python to simplify your life and work. My own experience in learning new things is that the information doesn't \"stick\" unless you try and use it for something in real life.\n", "\n", "You will no doubt need to learn more as you go. I've listed several other good references, including the [Python Tutorial](http://docs.python.org/2/tutorial/) and [Learn Python the Hard Way](http://learnpythonthehardway.org/book/). Additionally, now is a good time to start familiarizing yourself with the [Python Documentation](http://docs.python.org/2.7/), and, in particular, the [Python Language Reference](http://docs.python.org/2.7/reference/index.html).\n", "\n", "Tim Peters, one of the earliest and most prolific Python contributors, wrote the \"Zen of Python\", which can be accessed via the \"import this\" command:" ] }, { "cell_type": "code", "execution_count": 79, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "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" ] } ], "source": [ "import this" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "No matter how experienced a programmer you are, these are words to meditate on." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# II. Numpy and Scipy\n", "\n", "[Numpy](http://numpy.org) contains core routines for doing fast vector, matrix, and linear algebra-type operations in Python. [Scipy](http://scipy) contains additional routines for optimization, special functions, and so on. Both contain modules written in C and Fortran so that they're as fast as possible. Together, they give Python roughly the same capability that the [Matlab](http://www.mathworks.com/products/matlab/) program offers. (In fact, if you're an experienced Matlab user, there a [guide to Numpy for Matlab users](http://www.scipy.org/NumPy_for_Matlab_Users) just for you.)\n", "\n", "## Making vectors and matrices\n", "Fundamental to both Numpy and Scipy is the ability to work with vectors and matrices. You can create vectors from lists using the **array** command:" ] }, { "cell_type": "code", "execution_count": 80, "metadata": { "collapsed": true }, "outputs": [], "source": [ "import numpy as np\n", "import scipy as sp" ] }, { "cell_type": "code", "execution_count": 140, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([1, 2, 3, 4, 5, 6])" ] }, "execution_count": 140, "metadata": {}, "output_type": "execute_result" } ], "source": [ "array = np.array([1,2,3,4,5,6])\n", "array" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "size of the array" ] }, { "cell_type": "code", "execution_count": 141, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "(6,)" ] }, "execution_count": 141, "metadata": {}, "output_type": "execute_result" } ], "source": [ "array.shape" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To build matrices, you can either use the array command with lists of lists:" ] }, { "cell_type": "code", "execution_count": 135, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([[0, 1],\n", " [1, 0]])" ] }, "execution_count": 135, "metadata": {}, "output_type": "execute_result" } ], "source": [ "mat = np.array([[0,1],[1,0]])\n", "mat" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Add a column of ones to mat" ] }, { "cell_type": "code", "execution_count": 142, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([[ 0., 1., 1.],\n", " [ 1., 0., 1.]])" ] }, "execution_count": 142, "metadata": {}, "output_type": "execute_result" } ], "source": [ "mat2 = np.c_[mat, np.ones(2)]\n", "mat2" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "size of a matrix" ] }, { "cell_type": "code", "execution_count": 143, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "(2, 3)" ] }, "execution_count": 143, "metadata": {}, "output_type": "execute_result" } ], "source": [ "mat2.shape" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You can also form empty (zero) matrices of arbitrary shape (including vectors, which Numpy treats as vectors with one row), using the **zeros** command:" ] }, { "cell_type": "code", "execution_count": 83, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([[ 0., 0., 0.],\n", " [ 0., 0., 0.],\n", " [ 0., 0., 0.]])" ] }, "execution_count": 83, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.zeros((3,3))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "There's also an **identity** command that behaves as you'd expect:" ] }, { "cell_type": "code", "execution_count": 84, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([[ 1., 0., 0., 0.],\n", " [ 0., 1., 0., 0.],\n", " [ 0., 0., 1., 0.],\n", " [ 0., 0., 0., 1.]])" ] }, "execution_count": 84, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.identity(4)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "as well as a **ones** command." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Linspace, matrix functions, and plotting\n", "The **linspace** command makes a linear array of points from a starting to an ending value." ] }, { "cell_type": "code", "execution_count": 85, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([ 0. , 0.02040816, 0.04081633, 0.06122449, 0.08163265,\n", " 0.10204082, 0.12244898, 0.14285714, 0.16326531, 0.18367347,\n", " 0.20408163, 0.2244898 , 0.24489796, 0.26530612, 0.28571429,\n", " 0.30612245, 0.32653061, 0.34693878, 0.36734694, 0.3877551 ,\n", " 0.40816327, 0.42857143, 0.44897959, 0.46938776, 0.48979592,\n", " 0.51020408, 0.53061224, 0.55102041, 0.57142857, 0.59183673,\n", " 0.6122449 , 0.63265306, 0.65306122, 0.67346939, 0.69387755,\n", " 0.71428571, 0.73469388, 0.75510204, 0.7755102 , 0.79591837,\n", " 0.81632653, 0.83673469, 0.85714286, 0.87755102, 0.89795918,\n", " 0.91836735, 0.93877551, 0.95918367, 0.97959184, 1. ])" ] }, "execution_count": 85, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.linspace(0,1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "If you provide a third argument, it takes that as the number of points in the space. If you don't provide the argument, it gives a length 50 linear space." ] }, { "cell_type": "code", "execution_count": 86, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([ 0. , 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1. ])" ] }, "execution_count": 86, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.linspace(0,1,11)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**linspace** is an easy way to make coordinates for plotting. Functions in the numpy library (all of which are imported into IPython notebook) can act on an entire vector (or even a matrix) of points at once. Thus," ] }, { "cell_type": "code", "execution_count": 87, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([ 0.00000000e+00, 1.27877162e-01, 2.53654584e-01,\n", " 3.75267005e-01, 4.90717552e-01, 5.98110530e-01,\n", " 6.95682551e-01, 7.81831482e-01, 8.55142763e-01,\n", " 9.14412623e-01, 9.58667853e-01, 9.87181783e-01,\n", " 9.99486216e-01, 9.95379113e-01, 9.74927912e-01,\n", " 9.38468422e-01, 8.86599306e-01, 8.20172255e-01,\n", " 7.40277997e-01, 6.48228395e-01, 5.45534901e-01,\n", " 4.33883739e-01, 3.15108218e-01, 1.91158629e-01,\n", " 6.40702200e-02, -6.40702200e-02, -1.91158629e-01,\n", " -3.15108218e-01, -4.33883739e-01, -5.45534901e-01,\n", " -6.48228395e-01, -7.40277997e-01, -8.20172255e-01,\n", " -8.86599306e-01, -9.38468422e-01, -9.74927912e-01,\n", " -9.95379113e-01, -9.99486216e-01, -9.87181783e-01,\n", " -9.58667853e-01, -9.14412623e-01, -8.55142763e-01,\n", " -7.81831482e-01, -6.95682551e-01, -5.98110530e-01,\n", " -4.90717552e-01, -3.75267005e-01, -2.53654584e-01,\n", " -1.27877162e-01, -2.44929360e-16])" ] }, "execution_count": 87, "metadata": {}, "output_type": "execute_result" } ], "source": [ "x = np.linspace(0,2*np.pi)\n", "np.sin(x)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In conjunction with **matplotlib**, this is a nice way to plot things:" ] }, { "cell_type": "code", "execution_count": 88, "metadata": { "collapsed": true }, "outputs": [], "source": [ "%matplotlib inline\n", "import matplotlib.pyplot as plt" ] }, { "cell_type": "code", "execution_count": 89, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 89, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\ncv8fE9MA6egXChMAAAAASUVORK5CYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.plot(x,np.sin(x))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Matrix operations\n", "Matrix objects act sensibly when multiplied by scalars:" ] }, { "cell_type": "code", "execution_count": 90, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([[ 0.125, 0. , 0. ],\n", " [ 0. , 0.125, 0. ],\n", " [ 0. , 0. , 0.125]])" ] }, "execution_count": 90, "metadata": {}, "output_type": "execute_result" } ], "source": [ "0.125*np.identity(3)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "as well as when you add two matrices together. (However, the matrices have to be the same shape.)" ] }, { "cell_type": "code", "execution_count": 91, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([[ 2., 1.],\n", " [ 1., 3.]])" ] }, "execution_count": 91, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.identity(2) + np.array([[1,1],[1,2]])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Something that confuses Matlab users is that the times (*) operator give element-wise multiplication rather than matrix multiplication:" ] }, { "cell_type": "code", "execution_count": 92, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([[ 1., 0.],\n", " [ 0., 1.]])" ] }, "execution_count": 92, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.identity(2)*np.ones((2,2))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To get matrix multiplication, you need the **dot** command:" ] }, { "cell_type": "code", "execution_count": 93, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([[ 1., 1.],\n", " [ 1., 1.]])" ] }, "execution_count": 93, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.dot(np.identity(2),np.ones((2,2)))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**dot** can also do dot products (duh!):" ] }, { "cell_type": "code", "execution_count": 94, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "5.0" ] }, "execution_count": 94, "metadata": {}, "output_type": "execute_result" } ], "source": [ "v = np.array([3,4])\n", "np.sqrt(np.dot(v,v))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "as well as matrix-vector products." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "There are **determinant**, **inverse**, and **transpose** functions that act as you would suppose. Transpose can be abbreviated with \".T\" at the end of a matrix object:" ] }, { "cell_type": "code", "execution_count": 95, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([[1, 3],\n", " [2, 4]])" ] }, "execution_count": 95, "metadata": {}, "output_type": "execute_result" } ], "source": [ "m = np.array([[1,2],[3,4]])\n", "m.T" ] }, { "cell_type": "code", "execution_count": 160, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([[-2. , 1. ],\n", " [ 1.5, -0.5]])" ] }, "execution_count": 160, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.linalg.inv(m)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "There's also a **diag()** function that takes a list or a vector and puts it along the diagonal of a square matrix. " ] }, { "cell_type": "code", "execution_count": 96, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([[1, 0, 0, 0, 0],\n", " [0, 2, 0, 0, 0],\n", " [0, 0, 3, 0, 0],\n", " [0, 0, 0, 4, 0],\n", " [0, 0, 0, 0, 5]])" ] }, "execution_count": 96, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.diag([1,2,3,4,5])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We'll find this useful later on." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Least squares fitting\n", "Very often we deal with some data that we want to fit to some sort of expected behavior. Say we have the following:" ] }, { "cell_type": "code", "execution_count": 97, "metadata": { "collapsed": false }, "outputs": [], "source": [ "raw_data = \"\"\"\\\n", "3.1905781584582433,0.028208609537968457\n", "4.346895074946466,0.007160804747670053\n", "5.374732334047101,0.0046962988461934805\n", "8.201284796573875,0.0004614473299618756\n", "10.899357601713055,0.00005038370219939726\n", "16.295503211991434,4.377451812785309e-7\n", "21.82012847965739,3.0799922117601088e-9\n", "32.48394004282656,1.524776208284536e-13\n", "43.53319057815846,5.5012073588707224e-18\"\"\"" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "There's a section below on parsing CSV data. We'll steal the parser from that. For an explanation, skip ahead to that section. Otherwise, just assume that this is a way to parse that text into a numpy array that we can plot and do other analyses with." ] }, { "cell_type": "code", "execution_count": 98, "metadata": { "collapsed": false }, "outputs": [], "source": [ "data = []\n", "for line in raw_data.splitlines():\n", " words = line.split(',')\n", " data.append(words)\n", "data = np.array(data, dtype=np.float)" ] }, { "cell_type": "code", "execution_count": 99, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([[ 3.19057816e+00, 2.82086095e-02],\n", " [ 4.34689507e+00, 7.16080475e-03],\n", " [ 5.37473233e+00, 4.69629885e-03],\n", " [ 8.20128480e+00, 4.61447330e-04],\n", " [ 1.08993576e+01, 5.03837022e-05],\n", " [ 1.62955032e+01, 4.37745181e-07],\n", " [ 2.18201285e+01, 3.07999221e-09],\n", " [ 3.24839400e+01, 1.52477621e-13],\n", " [ 4.35331906e+01, 5.50120736e-18]])" ] }, "execution_count": 99, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data" ] }, { "cell_type": "code", "execution_count": 100, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([ 3.19057816, 4.34689507, 5.37473233, 8.2012848 ,\n", " 10.8993576 , 16.29550321, 21.82012848, 32.48394004, 43.53319058])" ] }, "execution_count": 100, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data[:, 0]" ] }, { "cell_type": "code", "execution_count": 101, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 101, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.title(\"Raw Data\")\n", "plt.xlabel(\"Distance\")\n", "plt.plot(data[:,0],data[:,1],'bo')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Since we expect the data to have an exponential decay, we can plot it using a semi-log plot." ] }, { "cell_type": "code", "execution_count": 102, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 102, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.title(\"Raw Data\")\n", "plt.xlabel(\"Distance\")\n", "plt.semilogy(data[:,0],data[:,1],'bo')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "For a pure exponential decay like this, we can fit the log of the data to a straight line. The above plot suggests this is a good approximation. Given a function\n", "$$ y = Ae^{-ax} $$\n", "$$ \\log(y) = \\log(A) - ax$$\n", "Thus, if we fit the log of the data versus x, we should get a straight line with slope $a$, and an intercept that gives the constant $A$.\n", "\n", "There's a numpy function called **polyfit** that will fit data to a polynomial form. We'll use this to fit to a straight line (a polynomial of order 1)" ] }, { "cell_type": "code", "execution_count": 103, "metadata": { "collapsed": false }, "outputs": [], "source": [ "params = sp.polyfit(data[:,0],np.log(data[:,1]),1)\n", "a = params[0]\n", "A = np.exp(params[1])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's see whether this curve fits the data." ] }, { "cell_type": "code", "execution_count": 104, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 104, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\nrMn6lHMAAAAASUVORK5CYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "x = np.linspace(1,45)\n", "plt.title(\"Raw Data\")\n", "plt.xlabel(\"Distance\")\n", "plt.semilogy(data[:,0],data[:,1],'bo')\n", "plt.semilogy(x,A*np.exp(a*x),'b-')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "If we have more complicated functions, we may not be able to get away with fitting to a simple polynomial. Consider the following data:" ] }, { "cell_type": "code", "execution_count": 150, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 150, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "gauss_data = \"\"\"\\\n", "-0.9902286902286903,1.4065274110372852e-19\n", "-0.7566104566104566,2.2504438576596563e-18\n", "-0.5117810117810118,1.9459459459459454\n", "-0.31887271887271884,10.621621621621626\n", "-0.250997150997151,15.891891891891893\n", "-0.1463309463309464,23.756756756756754\n", "-0.07267267267267263,28.135135135135133\n", "-0.04426734426734419,29.02702702702703\n", "-0.0015939015939017698,29.675675675675677\n", "0.04689304689304685,29.10810810810811\n", "0.0840994840994842,27.324324324324326\n", "0.1700546700546699,22.216216216216214\n", "0.370878570878571,7.540540540540545\n", "0.5338338338338338,1.621621621621618\n", "0.722014322014322,0.08108108108108068\n", "0.9926849926849926,-0.08108108108108646\"\"\"\n", "\n", "data = []\n", "for line in gauss_data.splitlines():\n", " words = line.split(',')\n", " data.append(words)\n", "data = np.array(data, dtype=np.float)\n", "\n", "plt.plot(data[:,0],data[:,1],'bo')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This data looks more Gaussian than exponential. If we wanted to, we could use **polyfit** for this as well, but let's use the **curve_fit** function from Scipy, which can fit to arbitrary functions. You can learn more using help(curve_fit).\n", "\n", "First define a general Gaussian function to fit to." ] }, { "cell_type": "code", "execution_count": 151, "metadata": { "collapsed": false }, "outputs": [], "source": [ "def gauss(x,A,a): \n", " return A*np.exp(a*x**2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now fit to it using **curve_fit**:" ] }, { "cell_type": "code", "execution_count": 152, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 152, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\nRK5CYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from scipy.optimize import curve_fit\n", "\n", "params,conv = curve_fit(gauss,data[:,0],data[:,1])\n", "x = np.linspace(-1,1)\n", "plt.plot(data[:,0],data[:,1],'bo')\n", "A,a = params\n", "plt.plot(x,gauss(x,A,a),'b-')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The **curve_fit** routine we just used is built on top of a very good general **minimization** capability in Scipy. You can learn more [at the scipy documentation pages](http://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.minimize.html)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Monte Carlo and random numbers\n", "Many methods in scientific computing rely on Monte Carlo integration, where a sequence of (pseudo) random numbers are used to approximate the integral of a function. Python has good random number generators in the standard library. The **random()** function gives pseudorandom numbers uniformly distributed between 0 and 1:" ] }, { "cell_type": "code", "execution_count": 153, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 153, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n7HH8PyKJV26lwiYPAAAAAElFTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from random import random\n", "rands = []\n", "for i in range(100):\n", " rands.append(random())\n", "plt.plot(rands)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**random()** uses the [Mersenne Twister](http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/emt.html) algorithm, which is a highly regarded pseudorandom number generator. There are also functions to generate random integers, to randomly shuffle a list, and functions to pick random numbers from a particular distribution, like the normal distribution:" ] }, { "cell_type": "code", "execution_count": 154, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 154, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from random import gauss\n", "grands = []\n", "for i in range(100):\n", " grands.append(gauss(0,1))\n", "plt.plot(grands)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "It is generally more efficient to generate a list of random numbers all at once, particularly if you're drawing from a non-uniform distribution. Numpy has functions to generate vectors and matrices of particular types of random distributions." ] }, { "cell_type": "code", "execution_count": 155, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 155, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\nQRCEHuf/AQD2A/ewIK59AAAAAElFTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.plot(np.random.rand(100))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Slicing numpy arrays and matrices" ] }, { "cell_type": "code", "execution_count": 156, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "(16, 2)" ] }, "execution_count": 156, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data.shape" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Select second column" ] }, { "cell_type": "code", "execution_count": 157, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([ 1.40652741e-19, 2.25044386e-18, 1.94594595e+00,\n", " 1.06216216e+01, 1.58918919e+01, 2.37567568e+01,\n", " 2.81351351e+01, 2.90270270e+01, 2.96756757e+01,\n", " 2.91081081e+01, 2.73243243e+01, 2.22162162e+01,\n", " 7.54054054e+00, 1.62162162e+00, 8.10810811e-02,\n", " -8.10810811e-02])" ] }, "execution_count": 157, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data[:, 1]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Select the first 5 rows" ] }, { "cell_type": "code", "execution_count": 158, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([[ -9.90228690e-01, 1.40652741e-19],\n", " [ -7.56610457e-01, 2.25044386e-18],\n", " [ -5.11781012e-01, 1.94594595e+00],\n", " [ -3.18872719e-01, 1.06216216e+01],\n", " [ -2.50997151e-01, 1.58918919e+01]])" ] }, "execution_count": 158, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data[:5, :]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Select the second row and the last column" ] }, { "cell_type": "code", "execution_count": 159, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "2.2504438576596563e-18" ] }, "execution_count": 159, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data[1, -1]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# III. Intermediate Python\n", "\n", "## Output Parsing\n", "As more and more of our day-to-day work is being done on and through computers, we increasingly have output that one program writes, often in a text file, that we need to analyze in one way or another, and potentially feed that output into another file.\n", "\n", "Suppose we have the following output:" ] }, { "cell_type": "code", "execution_count": 111, "metadata": { "collapsed": false }, "outputs": [], "source": [ "myoutput = \"\"\"\\\n", "@ Step Energy Delta E Gmax Grms Xrms Xmax Walltime\n", "@ ---- ---------------- -------- -------- -------- -------- -------- --------\n", "@ 0 -6095.12544083 0.0D+00 0.03686 0.00936 0.00000 0.00000 1391.5\n", "@ 1 -6095.25762870 -1.3D-01 0.00732 0.00168 0.32456 0.84140 10468.0\n", "@ 2 -6095.26325979 -5.6D-03 0.00233 0.00056 0.06294 0.14009 11963.5\n", "@ 3 -6095.26428124 -1.0D-03 0.00109 0.00024 0.03245 0.10269 13331.9\n", "@ 4 -6095.26463203 -3.5D-04 0.00057 0.00013 0.02737 0.09112 14710.8\n", "@ 5 -6095.26477615 -1.4D-04 0.00043 0.00009 0.02259 0.08615 20211.1\n", "@ 6 -6095.26482624 -5.0D-05 0.00015 0.00002 0.00831 0.03147 21726.1\n", "@ 7 -6095.26483584 -9.6D-06 0.00021 0.00004 0.01473 0.05265 24890.5\n", "@ 8 -6095.26484405 -8.2D-06 0.00005 0.00001 0.00555 0.01929 26448.7\n", "@ 9 -6095.26484599 -1.9D-06 0.00003 0.00001 0.00164 0.00564 27258.1\n", "@ 10 -6095.26484676 -7.7D-07 0.00003 0.00001 0.00161 0.00553 28155.3\n", "@ 11 -6095.26484693 -1.8D-07 0.00002 0.00000 0.00054 0.00151 28981.7\n", "@ 11 -6095.26484693 -1.8D-07 0.00002 0.00000 0.00054 0.00151 28981.7\"\"\"" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This output actually came from a geometry optimization of a Silicon cluster using the [NWChem](http://www.nwchem-sw.org/index.php/Main_Page) quantum chemistry suite. At every step the program computes the energy of the molecular geometry, and then changes the geometry to minimize the computed forces, until the energy converges. I obtained this output via the unix command\n", "\n", " % grep @ nwchem.out\n", "\n", "since NWChem is nice enough to precede the lines that you need to monitor job progress with the '@' symbol.\n", "\n", "We could do the entire analysis in Python; I'll show how to do this later on, but first let's focus on turning this code into a usable Python object that we can plot.\n", "\n", "First, note that the data is entered into a multi-line string. When Python sees three quote marks \"\"\" or ''' it treats everything following as part of a single string, including newlines, tabs, and anything else, until it sees the same three quote marks (\"\"\" has to be followed by another \"\"\", and ''' has to be followed by another ''') again. This is a convenient way to quickly dump data into Python, and it also reinforces the important idea that you don't have to open a file and deal with it one line at a time. You can read everything in, and deal with it as one big chunk.\n", "\n", "The first thing we'll do, though, is to split the big string into a list of strings, since each line corresponds to a separate piece of data. We will use the **splitlines()** function on the big myout string to break it into a new element every time it sees a newline (\\n) character:" ] }, { "cell_type": "code", "execution_count": 112, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "['@ Step Energy Delta E Gmax Grms Xrms Xmax Walltime',\n", " '@ ---- ---------------- -------- -------- -------- -------- -------- --------',\n", " '@ 0 -6095.12544083 0.0D+00 0.03686 0.00936 0.00000 0.00000 1391.5',\n", " '@ 1 -6095.25762870 -1.3D-01 0.00732 0.00168 0.32456 0.84140 10468.0',\n", " '@ 2 -6095.26325979 -5.6D-03 0.00233 0.00056 0.06294 0.14009 11963.5',\n", " '@ 3 -6095.26428124 -1.0D-03 0.00109 0.00024 0.03245 0.10269 13331.9',\n", " '@ 4 -6095.26463203 -3.5D-04 0.00057 0.00013 0.02737 0.09112 14710.8',\n", " '@ 5 -6095.26477615 -1.4D-04 0.00043 0.00009 0.02259 0.08615 20211.1',\n", " '@ 6 -6095.26482624 -5.0D-05 0.00015 0.00002 0.00831 0.03147 21726.1',\n", " '@ 7 -6095.26483584 -9.6D-06 0.00021 0.00004 0.01473 0.05265 24890.5',\n", " '@ 8 -6095.26484405 -8.2D-06 0.00005 0.00001 0.00555 0.01929 26448.7',\n", " '@ 9 -6095.26484599 -1.9D-06 0.00003 0.00001 0.00164 0.00564 27258.1',\n", " '@ 10 -6095.26484676 -7.7D-07 0.00003 0.00001 0.00161 0.00553 28155.3',\n", " '@ 11 -6095.26484693 -1.8D-07 0.00002 0.00000 0.00054 0.00151 28981.7',\n", " '@ 11 -6095.26484693 -1.8D-07 0.00002 0.00000 0.00054 0.00151 28981.7']" ] }, "execution_count": 112, "metadata": {}, "output_type": "execute_result" } ], "source": [ "lines = myoutput.splitlines()\n", "lines" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Splitting is a big concept in text processing. We used **splitlines()** here, and we will use the more general **split()** function below to split each line into whitespace-delimited words.\n", "\n", "We now want to do three things:\n", "\n", "* Skip over the lines that don't carry any information\n", "* Break apart each line that does carry information and grab the pieces we want\n", "* Turn the resulting data into something that we can plot.\n", "\n", "For this data, we really only want the Energy column, the Gmax column (which contains the maximum gradient at each step), and perhaps the Walltime column. \n", "\n", "Since the data is now in a list of lines, we can iterate over it:" ] }, { "cell_type": "code", "execution_count": 113, "metadata": { "collapsed": false }, "outputs": [], "source": [ "for line in lines[2:]:\n", " # do something with each line\n", " words = line.split()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's examine what we just did: first, we used a **for** loop to iterate over each line. However, we skipped the first two (the lines[2:] only takes the lines starting from index 2), since lines[0] contained the title information, and lines[1] contained underscores.\n", "\n", "We then split each line into chunks (which we're calling \"words\", even though in most cases they're numbers) using the string **split()** command. Here's what split does:" ] }, { "cell_type": "code", "execution_count": 114, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "['@',\n", " '0',\n", " '-6095.12544083',\n", " '0.0D+00',\n", " '0.03686',\n", " '0.00936',\n", " '0.00000',\n", " '0.00000',\n", " '1391.5']" ] }, "execution_count": 114, "metadata": {}, "output_type": "execute_result" } ], "source": [ "lines[2].split()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This is almost exactly what we want. We just have to now pick the fields we want:" ] }, { "cell_type": "code", "execution_count": 115, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "-6095.12544083 0.03686 1391.5\n", "-6095.25762870 0.00732 10468.0\n", "-6095.26325979 0.00233 11963.5\n", "-6095.26428124 0.00109 13331.9\n", "-6095.26463203 0.00057 14710.8\n", "-6095.26477615 0.00043 20211.1\n", "-6095.26482624 0.00015 21726.1\n", "-6095.26483584 0.00021 24890.5\n", "-6095.26484405 0.00005 26448.7\n", "-6095.26484599 0.00003 27258.1\n", "-6095.26484676 0.00003 28155.3\n", "-6095.26484693 0.00002 28981.7\n", "-6095.26484693 0.00002 28981.7\n" ] } ], "source": [ "for line in lines[2:]:\n", " # do something with each line\n", " words = line.split()\n", " energy = words[2]\n", " gmax = words[4]\n", " time = words[8]\n", " print(energy,gmax,time)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This is fine for printing things out, but if we want to do something with the data, either make a calculation with it or pass it into a plotting, we need to convert the strings into regular floating point numbers. We can use the **float()** command for this. We also need to save it in some form. I'll do this as follows:" ] }, { "cell_type": "code", "execution_count": 116, "metadata": { "collapsed": false }, "outputs": [], "source": [ "data = []\n", "for line in lines[2:]:\n", " # do something with each line\n", " words = line.split()\n", " energy = float(words[2])\n", " gmax = float(words[4])\n", " time = float(words[8])\n", " data.append((energy,gmax,time))\n", "data = np.array(data)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We now have our data in a numpy array, so we can choose columns to print:" ] }, { "cell_type": "code", "execution_count": 117, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 117, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.plot(data[:,0])\n", "plt.xlabel('step')\n", "plt.ylabel('Energy (hartrees)')\n", "plt.title('Convergence of NWChem geometry optimization for Si cluster')" ] }, { "cell_type": "code", "execution_count": 118, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 118, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n/x8dal8sV8HyTAAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "energies = data[:,0]\n", "minE = min(energies)\n", "energies_eV = 27.211*(energies-minE)\n", "plt.plot(energies_eV)\n", "plt.xlabel('step')\n", "plt.ylabel('Energy (eV)')\n", "plt.title('Convergence of NWChem geometry optimization for Si cluster')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This gives us the output in a form that we can think about: 4 eV is a fairly substantial energy change (chemical bonds are roughly this magnitude of energy), and most of the energy decrease was obtained in the first geometry iteration." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We mentioned earlier that we don't have to rely on **grep** to pull out the relevant lines for us. The **string** module has a lot of useful functions we can use for this. Among them is the **startswith** function. For example:" ] }, { "cell_type": "code", "execution_count": 119, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "@ Step Energy Delta E Gmax Grms Xrms Xmax Walltime\n", "@ ---- ---------------- -------- -------- -------- -------- -------- --------\n", "@ 0 -6095.12544083 0.0D+00 0.03686 0.00936 0.00000 0.00000 1391.5\n" ] } ], "source": [ "lines = \"\"\"\\\n", " ----------------------------------------\n", " | WALL | 0.45 | 443.61 |\n", " ----------------------------------------\n", "\n", "@ Step Energy Delta E Gmax Grms Xrms Xmax Walltime\n", "@ ---- ---------------- -------- -------- -------- -------- -------- --------\n", "@ 0 -6095.12544083 0.0D+00 0.03686 0.00936 0.00000 0.00000 1391.5\n", " ok ok\n", "\n", "\n", "\n", " Z-matrix (autoz)\n", " --------\n", "\"\"\".splitlines()\n", "\n", "for line in lines:\n", " if line.startswith('@'):\n", " print(line)\n", " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "and we've successfully grabbed all of the lines that begin with the @ symbol." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The real value in a language like Python is that it makes it easy to take additional steps to analyze data in this fashion, which means you are thinking more about your data, and are more likely to see important patterns." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Optional arguments\n", "You will recall that the **linspace** function can take either two arguments (for the starting and ending points):" ] }, { "cell_type": "code", "execution_count": 120, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([ 0. , 0.02040816, 0.04081633, 0.06122449, 0.08163265,\n", " 0.10204082, 0.12244898, 0.14285714, 0.16326531, 0.18367347,\n", " 0.20408163, 0.2244898 , 0.24489796, 0.26530612, 0.28571429,\n", " 0.30612245, 0.32653061, 0.34693878, 0.36734694, 0.3877551 ,\n", " 0.40816327, 0.42857143, 0.44897959, 0.46938776, 0.48979592,\n", " 0.51020408, 0.53061224, 0.55102041, 0.57142857, 0.59183673,\n", " 0.6122449 , 0.63265306, 0.65306122, 0.67346939, 0.69387755,\n", " 0.71428571, 0.73469388, 0.75510204, 0.7755102 , 0.79591837,\n", " 0.81632653, 0.83673469, 0.85714286, 0.87755102, 0.89795918,\n", " 0.91836735, 0.93877551, 0.95918367, 0.97959184, 1. ])" ] }, "execution_count": 120, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.linspace(0,1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "or it can take three arguments, for the starting point, the ending point, and the number of points:" ] }, { "cell_type": "code", "execution_count": 121, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([ 0. , 0.25, 0.5 , 0.75, 1. ])" ] }, "execution_count": 121, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.linspace(0,1,5)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You can also pass in keywords to exclude the endpoint:" ] }, { "cell_type": "code", "execution_count": 122, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([ 0. , 0.2, 0.4, 0.6, 0.8])" ] }, "execution_count": 122, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.linspace(0,1,5,endpoint=False)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Right now, we only know how to specify functions that have a fixed number of arguments. We'll learn how to do the more general cases here.\n", "\n", "If we're defining a simple version of linspace, we would start with:" ] }, { "cell_type": "code", "execution_count": 123, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "[0.0,\n", " 0.02040816326530612,\n", " 0.04081632653061224,\n", " 0.061224489795918366,\n", " 0.08163265306122448,\n", " 0.1020408163265306,\n", " 0.12244897959183673,\n", " 0.14285714285714285,\n", " 0.16326530612244897,\n", " 0.18367346938775508,\n", " 0.2040816326530612,\n", " 0.22448979591836732,\n", " 0.24489795918367346,\n", " 0.26530612244897955,\n", " 0.2857142857142857,\n", " 0.3061224489795918,\n", " 0.32653061224489793,\n", " 0.3469387755102041,\n", " 0.36734693877551017,\n", " 0.3877551020408163,\n", " 0.4081632653061224,\n", " 0.42857142857142855,\n", " 0.44897959183673464,\n", " 0.4693877551020408,\n", " 0.4897959183673469,\n", " 0.5102040816326531,\n", " 0.5306122448979591,\n", " 0.5510204081632653,\n", " 0.5714285714285714,\n", " 0.5918367346938775,\n", " 0.6122448979591836,\n", " 0.6326530612244897,\n", " 0.6530612244897959,\n", " 0.673469387755102,\n", " 0.6938775510204082,\n", " 0.7142857142857142,\n", " 0.7346938775510203,\n", " 0.7551020408163265,\n", " 0.7755102040816326,\n", " 0.7959183673469387,\n", " 0.8163265306122448,\n", " 0.836734693877551,\n", " 0.8571428571428571,\n", " 0.8775510204081632,\n", " 0.8979591836734693,\n", " 0.9183673469387754,\n", " 0.9387755102040816,\n", " 0.9591836734693877,\n", " 0.9795918367346939,\n", " 0.9999999999999999]" ] }, "execution_count": 123, "metadata": {}, "output_type": "execute_result" } ], "source": [ "def my_linspace(start,end):\n", " npoints = 50\n", " v = []\n", " d = (end-start)/float(npoints-1)\n", " for i in range(npoints):\n", " v.append(start + i*d)\n", " return v\n", "my_linspace(0,1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can add an optional argument by specifying a default value in the argument list:" ] }, { "cell_type": "code", "execution_count": 124, "metadata": { "collapsed": false }, "outputs": [], "source": [ "def my_linspace(start,end,npoints = 50):\n", " v = []\n", " d = (end-start)/float(npoints-1)\n", " for i in range(npoints):\n", " v.append(start + i*d)\n", " return v" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This gives exactly the same result if we don't specify anything:" ] }, { "cell_type": "code", "execution_count": 125, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "[0.0,\n", " 0.02040816326530612,\n", " 0.04081632653061224,\n", " 0.061224489795918366,\n", " 0.08163265306122448,\n", " 0.1020408163265306,\n", " 0.12244897959183673,\n", " 0.14285714285714285,\n", " 0.16326530612244897,\n", " 0.18367346938775508,\n", " 0.2040816326530612,\n", " 0.22448979591836732,\n", " 0.24489795918367346,\n", " 0.26530612244897955,\n", " 0.2857142857142857,\n", " 0.3061224489795918,\n", " 0.32653061224489793,\n", " 0.3469387755102041,\n", " 0.36734693877551017,\n", " 0.3877551020408163,\n", " 0.4081632653061224,\n", " 0.42857142857142855,\n", " 0.44897959183673464,\n", " 0.4693877551020408,\n", " 0.4897959183673469,\n", " 0.5102040816326531,\n", " 0.5306122448979591,\n", " 0.5510204081632653,\n", " 0.5714285714285714,\n", " 0.5918367346938775,\n", " 0.6122448979591836,\n", " 0.6326530612244897,\n", " 0.6530612244897959,\n", " 0.673469387755102,\n", " 0.6938775510204082,\n", " 0.7142857142857142,\n", " 0.7346938775510203,\n", " 0.7551020408163265,\n", " 0.7755102040816326,\n", " 0.7959183673469387,\n", " 0.8163265306122448,\n", " 0.836734693877551,\n", " 0.8571428571428571,\n", " 0.8775510204081632,\n", " 0.8979591836734693,\n", " 0.9183673469387754,\n", " 0.9387755102040816,\n", " 0.9591836734693877,\n", " 0.9795918367346939,\n", " 0.9999999999999999]" ] }, "execution_count": 125, "metadata": {}, "output_type": "execute_result" } ], "source": [ "my_linspace(0,1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "But also let's us override the default value with a third argument:" ] }, { "cell_type": "code", "execution_count": 126, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "[0.0, 0.25, 0.5, 0.75, 1.0]" ] }, "execution_count": 126, "metadata": {}, "output_type": "execute_result" } ], "source": [ "my_linspace(0,1,5)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can add arbitrary keyword arguments to the function definition by putting a keyword argument \\*\\*kwargs handle in:" ] }, { "cell_type": "code", "execution_count": 127, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "[0.0, 0.2, 0.4, 0.6000000000000001, 0.8]" ] }, "execution_count": 127, "metadata": {}, "output_type": "execute_result" } ], "source": [ "def my_linspace(start,end,npoints=50,**kwargs):\n", " endpoint = kwargs.get('endpoint',True)\n", " v = []\n", " if endpoint:\n", " d = (end-start)/float(npoints-1)\n", " else:\n", " d = (end-start)/float(npoints)\n", " for i in range(npoints):\n", " v.append(start + i*d)\n", " return v\n", "my_linspace(0,1,5,endpoint=False)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "What the keyword argument construction does is to take any additional keyword arguments (i.e. arguments specified by name, like \"endpoint=False\"), and stick them into a dictionary called \"kwargs\" (you can call it anything you like, but it has to be preceded by two stars). You can then grab items out of the dictionary using the **get** command, which also lets you specify a default value. I realize it takes a little getting used to, but it is a common construction in Python code, and you should be able to recognize it.\n", "\n", "There's an analogous \\*args that dumps any additional arguments into a list called \"args\". Think about the **range** function: it can take one (the endpoint), two (starting and ending points), or three (starting, ending, and step) arguments. How would we define this?" ] }, { "cell_type": "code", "execution_count": 128, "metadata": { "collapsed": false }, "outputs": [], "source": [ "def my_range(*args):\n", " start = 0\n", " step = 1\n", " if len(args) == 1:\n", " end = args[0]\n", " elif len(args) == 2:\n", " start,end = args\n", " elif len(args) == 3:\n", " start,end,step = args\n", " else:\n", " raise Exception(\"Unable to parse arguments\")\n", " v = []\n", " value = start\n", " while True:\n", " v.append(value)\n", " value += step\n", " if value > end: break\n", " return v" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Note that we have defined a few new things you haven't seen before: a **break** statement, that allows us to exit a for loop if some conditions are met, and an exception statement, that causes the interpreter to exit with an error message. For example:" ] }, { "cell_type": "code", "execution_count": 129, "metadata": { "collapsed": false }, "outputs": [ { "ename": "Exception", "evalue": "Unable to parse arguments", "output_type": "error", "traceback": [ "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[1;31mException\u001b[0m Traceback (most recent call last)", "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m()\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0mmy_range\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[1;32m\u001b[0m in \u001b[0;36mmy_range\u001b[1;34m(*args)\u001b[0m\n\u001b[0;32m 9\u001b[0m \u001b[0mstart\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0mend\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0mstep\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0margs\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 10\u001b[0m \u001b[1;32melse\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 11\u001b[1;33m \u001b[1;32mraise\u001b[0m \u001b[0mException\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m\"Unable to parse arguments\"\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 12\u001b[0m \u001b[0mv\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;33m[\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 13\u001b[0m \u001b[0mvalue\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mstart\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", "\u001b[1;31mException\u001b[0m: Unable to parse arguments" ] } ], "source": [ "my_range()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## List Comprehensions and Generators\n", "List comprehensions are a streamlined way to make lists. They look something like a list definition, with some logic thrown in. For example:" ] }, { "cell_type": "code", "execution_count": 130, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]\n" ] } ], "source": [ "evens1 = [2*i for i in range(10)]\n", "print(evens1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You can also put some boolean testing into the construct:" ] }, { "cell_type": "code", "execution_count": 131, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "[1, 3, 5, 7, 9, 11, 13, 15, 17, 19]" ] }, "execution_count": 131, "metadata": {}, "output_type": "execute_result" } ], "source": [ "odds = [i for i in range(20) if i%2==1]\n", "odds" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Here i%2 is the remainder when i is divided by 2, so that i%2==1 is true if the number is odd. Even though this is a relative new addition to the language, it is now fairly common since it's so convenient." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**iterators** are a way of making virtual sequence objects. Consider if we had the nested loop structure:\n", "\n", " for i in range(1000000):\n", " for j in range(1000000):\n", "\n", "Inside the main loop, we make a list of 1,000,000 integers, just to loop over them one at a time. We don't need any of the additional things that a lists gives us, like slicing or random access, we just need to go through the numbers one at a time. And we're making 1,000,000 of them. \n", "\n", "**iterators** are a way around this. For example, the **xrange** function is the iterator version of range. This simply makes a counter that is looped through in sequence, so that the analogous loop structure would look like:\n", "\n", " for i in xrange(1000000):\n", " for j in xrange(1000000):\n", "\n", "Even though we've only added two characters, we've dramatically sped up the code, because we're not making 1,000,000 big lists.\n", "\n", "We can define our own iterators using the **yield** statement:" ] }, { "cell_type": "code", "execution_count": 132, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0\n", "2\n", "4\n", "6\n", "8\n" ] } ], "source": [ "def evens_below(n):\n", " for i in range(n):\n", " if i%2 == 0:\n", " yield i\n", " return\n", "\n", "for i in evens_below(9):\n", " print(i)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can always turn an iterator into a list using the **list** command:" ] }, { "cell_type": "code", "execution_count": 133, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "[0, 2, 4, 6, 8]" ] }, "execution_count": 133, "metadata": {}, "output_type": "execute_result" } ], "source": [ "list(evens_below(9))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "There's a special syntax called a **generator expression** that looks a lot like a list comprehension:" ] }, { "cell_type": "code", "execution_count": 134, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0\n", "2\n", "4\n", "6\n", "8\n" ] } ], "source": [ "evens_gen = (i for i in range(9) if i%2==0)\n", "for i in evens_gen:\n", " print(i)" ] } ], "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.1" } }, "nbformat": 4, "nbformat_minor": 0 }