{ "metadata": { "name": "", "signature": "sha256:a623f29496b1602fe268ebb0399fc26f082e951a43161caa8eaff7abb5ad06d2" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ { "cell_type": "heading", "level": 1, "metadata": {}, "source": [ "2.18 Programming for Geoscientists class test - 14:00-16:00 18th December 2014\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#Test instructions\n", "\n", "* This test contains **5** questions each of which should be answered.\n", "* Write your program in a Python cell just under each question.\n", "* You can write an explanation of your solution as comments in your code.\n", "* In each case your solution program must fulfil all of the instructions - please check the instructions carefully and double check that your program fulfils all of the given instructions.\n", "* Save your work regularly.\n", "* At the end of the test you should email your IPython notebook document (i.e. this document) to [Gerard J. Gorman](http://www.imperial.ac.uk/people/g.gorman) at g.gorman@imperial.ac.uk" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Question 1** \n", "\n", "* Correct the 5 errors in the following program.\n", "* In each case add a comment explaining the error and the fix.\n", "* To verify your answer remember that $sin ^2( x ) + cos ^2( x ) = 1$." ] }, { "cell_type": "code", "collapsed": false, "input": [ "from math import sin, cos\n", "x = pi /4\n", "1_val = sin^2( x ) + cos^2( x )\n", "print 1_VAL" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "code", "collapsed": false, "input": [ "# Fix 1: pi needs to be imported from the math module before it can be used in the line below.\n", "from math import sin, cos, pi\n", "\n", "x = pi /4\n", "\n", "# Fix 2: 1_val is not a valid variable name - it cannot start with a number\n", "# Fix 3: raising something to a power is done using **, not ^\n", "# Fix 4: when calling sin or cos, it's name must be followed by the arguments in brackets. If we want to represent $\\sin^2(x)$\n", "# in Python, we have to write it like $\\sin(x)^2$, i.e. sin(x)**2.\n", "val = sin(x)**2 + cos(x)**2\n", "\n", "# Fix 5: variable names are case-sensitive in Python. val is not the same as VAL.\n", "print val" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "1.0\n" ] } ], "prompt_number": 2 }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Question 2**\n", "\n", "* Create a python list containing 101 evenly spaced values between -1.0 and 1.0.\n", "* Show how this could be more efficently done using NumPy.\n", "* Print out the values using a formatted print statement." ] }, { "cell_type": "code", "collapsed": false, "input": [ "n = 101 # The number of values\n", "start = -1.0\n", "end = 1.0\n", "dx = (end-start)/(n-1) # The distance between each value\n", "\n", "values = [start + i*dx for i in range(n)]\n", "print values\n", "\n", "from numpy import linspace\n", "values_numpy = linspace(start, end, n)\n", "\n", "for v in values_numpy:\n", " print \"%.2f\" % (v)\n", " " ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "[-1.0, -0.98, -0.96, -0.94, -0.92, -0.9, -0.88, -0.86, -0.84, -0.8200000000000001, -0.8, -0.78, -0.76, -0.74, -0.72, -0.7, -0.6799999999999999, -0.6599999999999999, -0.64, -0.62, -0.6, -0.5800000000000001, -0.56, -0.54, -0.52, -0.5, -0.48, -0.45999999999999996, -0.43999999999999995, -0.42000000000000004, -0.4, -0.38, -0.36, -0.33999999999999997, -0.31999999999999995, -0.29999999999999993, -0.28, -0.26, -0.24, -0.21999999999999997, -0.19999999999999996, -0.17999999999999994, -0.16000000000000003, -0.14, -0.12, -0.09999999999999998, -0.07999999999999996, -0.05999999999999994, -0.040000000000000036, -0.020000000000000018, 0.0, 0.020000000000000018, 0.040000000000000036, 0.06000000000000005, 0.08000000000000007, 0.10000000000000009, 0.1200000000000001, 0.14000000000000012, 0.15999999999999992, 0.17999999999999994, 0.19999999999999996, 0.21999999999999997, 0.24, 0.26, 0.28, 0.30000000000000004, 0.32000000000000006, 0.3400000000000001, 0.3600000000000001, 0.3800000000000001, 0.40000000000000013, 0.41999999999999993, 0.43999999999999995, 0.45999999999999996, 0.48, 0.5, 0.52, 0.54, 0.56, 0.5800000000000001, 0.6000000000000001, 0.6200000000000001, 0.6400000000000001, 0.6600000000000001, 0.6799999999999999, 0.7, 0.72, 0.74, 0.76, 0.78, 0.8, 0.8200000000000001, 0.8400000000000001, 0.8600000000000001, 0.8800000000000001, 0.9000000000000001, 0.9199999999999999, 0.94, 0.96, 0.98, 1.0]\n", "-1.00" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n", "-0.98\n", "-0.96\n", "-0.94\n", "-0.92\n", "-0.90\n", "-0.88\n", "-0.86\n", "-0.84\n", "-0.82\n", "-0.80\n", "-0.78\n", "-0.76\n", "-0.74\n", "-0.72\n", "-0.70\n", "-0.68\n", "-0.66\n", "-0.64\n", "-0.62\n", "-0.60\n", "-0.58\n", "-0.56\n", "-0.54\n", "-0.52\n", "-0.50\n", "-0.48\n", "-0.46\n", "-0.44\n", "-0.42\n", "-0.40\n", "-0.38\n", "-0.36\n", "-0.34\n", "-0.32\n", "-0.30\n", "-0.28\n", "-0.26\n", "-0.24\n", "-0.22\n", "-0.20\n", "-0.18\n", "-0.16\n", "-0.14\n", "-0.12\n", "-0.10\n", "-0.08\n", "-0.06\n", "-0.04\n", "-0.02\n", "0.00\n", "0.02\n", "0.04\n", "0.06\n", "0.08\n", "0.10\n", "0.12\n", "0.14\n", "0.16\n", "0.18\n", "0.20\n", "0.22\n", "0.24\n", "0.26\n", "0.28\n", "0.30\n", "0.32\n", "0.34\n", "0.36\n", "0.38\n", "0.40\n", "0.42\n", "0.44\n", "0.46\n", "0.48\n", "0.50\n", "0.52\n", "0.54\n", "0.56\n", "0.58\n", "0.60\n", "0.62\n", "0.64\n", "0.66\n", "0.68\n", "0.70\n", "0.72\n", "0.74\n", "0.76\n", "0.78\n", "0.80\n", "0.82\n", "0.84\n", "0.86\n", "0.88\n", "0.90\n", "0.92\n", "0.94\n", "0.96\n", "0.98\n", "1.00\n" ] } ], "prompt_number": 11 }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Question 3**\n", "\n", "* a. Write a python function that evaluates the equation below for input variables $x$ and $t$: $$f(x, t) = e^{-(x-3t)^2} \\sin \\left( 3\\pi \\left( x-t \\right) \\right)$$\n", "* b. Generate an array of $x$ values in the range $(-3.0, 10)$.\n", "* c. Using this array of x values, plot the function for $t=0.0$, $t=1.0$ and $t=2.0$." ] }, { "cell_type": "code", "collapsed": false, "input": [ "from numpy import *\n", "from pylab import *\n", "%pylab inline\n", "def f(x, t):\n", " return exp(-(x-3*t)**2)*sin(3*pi*(x-t))\n", "\n", "n = 1000\n", "xarray = linspace(-3, 10, n)\n", "\n", "for t in [0, 1, 2]:\n", " plot(xarray, f(xarray, t), label=r\"$t$ = %.1f\" % (t))\n", "xlabel(r\"$x$\")\n", "ylabel(r\"$f(x,t)$\")\n", "legend(loc=\"best\")\n", "show()" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Populating the interactive namespace from numpy and matplotlib\n" ] }, { "output_type": "stream", "stream": "stderr", "text": [ "WARNING: pylab import has clobbered these variables: ['power', 'draw_if_interactive', 'random', 'fft', 'linalg', 'info']\n", "`%pylab --no-import-all` prevents importing * from pylab and numpy\n" ] }, { "metadata": {}, "output_type": "display_data", "png": "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\nhy17d9cAAAAASUVORK5CYII=\n", "text": [ "" ] } ], "prompt_number": 47 }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Question 4**\n", "\n", "* Write a program to read the data file *seismic.dat* and store the magnitude of the earthquakes in an numpy array.\n", "* How many earthquakes are there above magnitude 6.0?" ] }, { "cell_type": "code", "collapsed": false, "input": [ "from numpy import *\n", "f = open(\"seismic.dat\", \"r\")\n", "\n", "magnitude = []\n", "for line in f:\n", " s = line.split()\n", " magnitude.append(float(s[-1])) # The last column is the \"magnitude\"\n", "magnitude = array(magnitude)\n", "\n", "f.close()\n", "\n", "print magnitude\n", "\n", "count = 0\n", "for m in magnitude:\n", " if m > 6.0:\n", " count += 1\n", "print \"There are %d earthquakes above magnitude 6.0\" % (count)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "[ 6.6 6.1 5.2 5. 5.1 7.3 5.2 5.4 5.4 5.7 5.2 5.6 7.6 5.7 5.4\n", " 5.4 5.5 5.2 6.1 6.1 6.2 6. 5.2 5.6 5.1 5.5 5.2 5.2 6.7 5.5\n", " 6.5 5.6 6. 5.7 6.3 5.5 5.5 5.6 6.4 5.2 5.5 5.4 5.7 5.8 5.3\n", " 5.4 5.6 5.3 5.6 5.5 5.7 5.9 5.1 5.7 7. 6.4 5.6 5.2 6.1 6.7\n", " 5.9 5.4 5.9 5.6 5.8 6.1 5. 5.3 5.4 5.2 5.2 5.9 5.4 5.2 5.7\n", " 6.1 5.6 5.3 5.3 6.1 5.4 5.3 5.5 5.4 5.5 5.8 5.4 5.1 5.3 5.2\n", " 7.2 5.4 5.5 5. 5. 5.6 6.4 5.2 7.1 5.2 5.1 5.3 5.1 5.4 5.2\n", " 4.9 5.4 5. 5.1 5.4 5.1 5.2 5.3 5. 5.1 7.5 6.6 5.1 5.1 5.1\n", " 5.3 5.5 6.8 6.1 5. 5.3 5.3 6.6 5.6 5.9 5.2 5.4 5.3 5.1 5.1\n", " 5.1 4.9 7.8 5.4 5.1 5.8 5.2 5.1 5.5 5.3 5. 6.1 5. 5.2 5.1\n", " 5.3 5.6 5.3 5. 5.2 7. 4.8 4.9 5. 5. 5. 5.6 6.1 5.5 5.6\n", " 4.9 5. 5. 5.1 5.2 6. 4.9 5.2 5.6 5.5 4.8 5.2 5.7 5.4 5.8\n", " 4.9 5.2 4.9 6. 5.2 5.4 4.9 5.1 6.3 5. 5. 5.7 4.9 6.4 5.5\n", " 5.7 6.5 5.1 5. 6.6 5.6 5.9 5.9 5.4 5.2 5. 5.7]\n", "There are 34 earthquakes above magnitude 6.0\n" ] } ], "prompt_number": 21 }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Question 5** The file *human_evolution.txt* holds information about various human species and their hight, weight, and brain volume. \n", "\n", "* Write a program that reads this file and stores the data in a python dictionary humans.\n", "* The dictionary key should correspond to the specie name (e.g., \u201chomo erectus\u201d), and the value should be a list containing the corresponding data. For example, humans[\"H. habilis\"] should give [\"2.2 - 1.6\", \"1.0 - 1.5\", \"33 - 55\", \"660\"].\n", "* Write out the humans dictionary in a formatted tabular form." ] }, { "cell_type": "code", "collapsed": false, "input": [ "f = open(\"human_evolution.txt\", \"r\")\n", "\n", "humans = {}\n", "\n", "for line in f:\n", " # Ignore lines that don't start with \"H.\"\n", " if(line[0:2] != \"H.\"):\n", " continue\n", " \n", " # Get each column and strip out leading and trailing whitespace\n", " name = line[0:21].strip()\n", " lived = line[21:37].strip()\n", " height = line[37:50].strip()\n", " mass = line[50:62].strip()\n", " brain_volume = line[62:].strip()\n", " \n", " # Add to dictionary\n", " humans[name] = [lived, height, mass, brain_volume]\n", "f.close()\n", "\n", "# Test\n", "print humans[\"H. habilis\"]\n", "\n", "print \"%25s %25s %25s %25s %25s\" % (\"Species\", \"Lived when (M. years)\", \"Adult height (m)\", \"Adult mass (kg)\", \"Brain volume (cm**3)\")\n", "for human in humans:\n", " data = humans[human]\n", " print \"%25s %25s %25s %25s %25s\" % (human, data[0], data[1], data[2], data[3])" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "['2.2 - 1.6', '1.0 - 1.5', '33 - 55', '660']\n", " Species Lived when (M. years) Adult height (m) Adult mass (kg) Brain volume (cm**3)\n", " H. neanderthalensis 0.35 - 0.03 1.6 55 - 70 1200 - 1700\n", " H. sapiens sapiens 0.2 - present 1.4 - 1.9 50 - 100 1000 - 1850\n", " H. heidelbergensis 0.6 - 0.35 1.8 60 1100 - 1400\n", " H. erectus 1.4 - 0.2 1.8 60 850 (early) - 1100 (late)\n", " H. floresiensis 0.10 - 0.012 1.0 25 400\n", " H. ergaster 1.9 - 1.4 1.9 700 - 850\n", " H. habilis 2.2 - 1.6 1.0 - 1.5 33 - 55 660\n" ] } ], "prompt_number": 46 }, { "cell_type": "code", "collapsed": false, "input": [], "language": "python", "metadata": {}, "outputs": [] } ], "metadata": {} } ] }