{ "metadata": { "name": "", "signature": "sha256:32e54030e454434b679bf07efcededb1d0e19b7f2391ad719ede30eec50a8c8d" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ { "cell_type": "heading", "level": 1, "metadata": {}, "source": [ "Brief introduction to python, numpy and dimarray" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "by Mah\u00e9 Perrette\n", "\n", "ModStrat Seminar, 22nd May, 2014\n", "\n", "Potsdam Institute for Climate Impact Research" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Table of Content\n", "- [Brief introduction to python, numpy and dimarray](#Brief-introduction-to-python,-numpy-and-dimarray)\n", " - [Brief introduction to python](#Brief-introduction-to-python)\n", " - [namespace & import](#namespace-&-import)\n", " - [indentation instead of parenthesis](#indentation-instead-of-parenthesis)\n", " - [object oriented](#object-oriented)\n", " - [Scientific python: numpy and matplotlib via pylab](#Scientific-python:-numpy-and-matplotlib-via-pylab)\n", " - [pylab](#pylab)\n", " - [numpy array: basic properties](#numpy-array:-basic-properties)\n", " - [generating common arrays](#generating-common-arrays)\n", " - [array attributes and methods](#array-attributes-and-methods)\n", " - [multidimensional arrays](#multidimensional-arrays)\n", " - [plotting](#plotting)\n", " - [dimarray package](#dimarray-package)\n", " - [Concept: Provide labelled axes along with arrays](#Concept:-Provide-labelled-axes-along-with-arrays)\n", " - [data structure](#data-structure)\n", " - [indexing](#indexing)\n", " - [enhanced numpy transformations](#enhanced-numpy-transformations)\n", " - [Examples using dimarray](#Examples-using-dimarray)\n", " - [Read and plot netCDF files](#Read-and-plot-netCDF-files)\n", " - [Alignment features](#Alignment-features)\n", " - [Stack or concatenate arrays](#Stack-or-concatenate-arrays)\n", " - [Save data to netCDF ](#Save-data-to-netCDF-)\n", " - [Big data: grouping, reshaping, display](#Big-data:-grouping,-reshaping,-display)\n", " - [geoarray features](#geoarray-features)\n", " - [application: warming tool](#application:-warming-tool)\n", " - [Useful links](#Useful-links)" ] }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "Brief introduction to python" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "- Open source, general-purpose programming language (e.g. can also create GUI applications, websites) \n", "- Use of namespaces\n", "- Object-oriented \n", "- Created in late 1980s by Guido van Rossum, later `numpy` package (2006), `matplotlib` etc..." ] }, { "cell_type": "code", "collapsed": false, "input": [ "2+3" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 1, "text": [ "5" ] } ], "prompt_number": 1 }, { "cell_type": "code", "collapsed": false, "input": [ "mylist = ['a', 'b', 'c', 'd'] \n", "mylist" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 2, "text": [ "['a', 'b', 'c', 'd']" ] } ], "prompt_number": 2 }, { "cell_type": "code", "collapsed": false, "input": [ "mylist[0] # 0-based index" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 3, "text": [ "'a'" ] } ], "prompt_number": 3 }, { "cell_type": "code", "collapsed": false, "input": [ "mydict = dict(a=1, b=2) \n", "mydict" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 4, "text": [ "{'a': 1, 'b': 2}" ] } ], "prompt_number": 4 }, { "cell_type": "code", "collapsed": false, "input": [ "mydict['b'] # access element by key" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 5, "text": [ "2" ] } ], "prompt_number": 5 }, { "cell_type": "heading", "level": 3, "metadata": {}, "source": [ "namespace & import" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "python is a __general-purpose__ programming language, with basic functionalities reduced to a minimum. \n", " \n", "Some variables and function names are defined by default without the need of importing anything..." ] }, { "cell_type": "code", "collapsed": false, "input": [ "sum([1, 2, 3, 4])" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 6, "text": [ "10" ] } ], "prompt_number": 6 }, { "cell_type": "markdown", "metadata": {}, "source": [ "... but others are not:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "exp(0)" ], "language": "python", "metadata": {}, "outputs": [ { "ename": "NameError", "evalue": "name 'exp' is not defined", "output_type": "pyerr", "traceback": [ "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m\n\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[0mexp\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m0\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[1;31mNameError\u001b[0m: name 'exp' is not defined" ] } ], "prompt_number": 7 }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "-" } }, "source": [ "In that case, need to __import specific packages__:\n", "after importing a package, it is possible to access its functions with \".\"" ] }, { "cell_type": "code", "collapsed": false, "input": [ "import numpy" ], "language": "python", "metadata": { "slideshow": { "slide_type": "-" } }, "outputs": [], "prompt_number": 8 }, { "cell_type": "code", "collapsed": false, "input": [ "numpy.exp(0) " ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 9, "text": [ "1.0" ] } ], "prompt_number": 9 }, { "cell_type": "markdown", "metadata": {}, "source": [ "But `numpy` is a bit long to type for each command. There are quite a few ways of going around that, such as defining an __alias__:\n", " \n", " import numpy as np\n", " np.exp(0)\n", " \n", "or importing the function directly:\n", " \n", " from numpy import exp\n", " exp(0)\n", " \n", "or even importing everything (not recommanded):\n", "\n", " from numpy import * \n", " exp(0)" ] }, { "cell_type": "heading", "level": 3, "metadata": {}, "source": [ "indentation instead of parenthesis" ] }, { "cell_type": "code", "collapsed": false, "input": [ "for i in range(5):\n", " print i" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "0\n", "1\n", "2\n", "3\n", "4\n" ] } ], "prompt_number": 10 }, { "cell_type": "code", "collapsed": false, "input": [ "if 4 > 2:\n", " print 'no parenthesis'\n", "else:\n", " print 'nope'" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "no parenthesis\n" ] } ], "prompt_number": 11 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Functions take named arguments, and optional arguments as well" ] }, { "cell_type": "code", "collapsed": false, "input": [ "def myfunc(a, b=2):\n", " \"\"\" my documentation\n", " \"\"\"\n", " return a+b\n", "\n", "# functions are a particular type of variables\n", "myfunc" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 12, "text": [ "" ] } ], "prompt_number": 12 }, { "cell_type": "code", "collapsed": false, "input": [ "myfunc(3)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 13, "text": [ "5" ] } ], "prompt_number": 13 }, { "cell_type": "code", "collapsed": false, "input": [ "myfunc(3, b=5)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 14, "text": [ "8" ] } ], "prompt_number": 14 }, { "cell_type": "heading", "level": 3, "metadata": {}, "source": [ "object oriented" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "Like in C, classes can be defined with attributes and methods.\n", "Class attributes and methods can be accessed with __\".\"__ like for variables or functions in a module:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "class Ocean: \n", " T = 25 # ocean temperature\n", " cp = 4000 # sea water heat capacity\n", " V = 1e6 # volume" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 15 }, { "cell_type": "code", "collapsed": false, "input": [ "indian = Ocean ()\n", "indian" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 16, "text": [ "<__main__.Ocean instance at 0x7f3debfa8a28>" ] } ], "prompt_number": 16 }, { "cell_type": "code", "collapsed": false, "input": [ "indian.T" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 17, "text": [ "25" ] } ], "prompt_number": 17 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Add a method `energy`:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "class Ocean2: \n", " T = 25 # ocean temperature\n", " cp = 4000 # sea water heat capacity\n", " V = 1e6 # volume\n", " \n", " def energy(self): # class method, like a function defined within a class\n", " return self.cp*self.T*self.V" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 18 }, { "cell_type": "code", "collapsed": false, "input": [ "indian = Ocean2()\n", "indian.energy()" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 19, "text": [ "100000000000.0" ] } ], "prompt_number": 19 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Overload operator, add an `__add__` method." ] }, { "cell_type": "code", "collapsed": false, "input": [ "class Ocean3: \n", " T = 25 # ocean temperature\n", " cp = 4000 # sea water heat capacity\n", " V = 1e6 # volume\n", " \n", " def energy(self): # class method, like a function defined within a class\n", " return self.cp*self.T*self.V\n", " \n", " def __add__(self, other):\n", " res = Ocean3()\n", " res.T = 0.5*(self.T + other.T)\n", " res.cp = 0.5*(self.cp+other.cp) \n", " res.V = self.V+other.V\n", " return res" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 20 }, { "cell_type": "code", "collapsed": false, "input": [ "indian = Ocean3()\n", "big = indian + indian" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 21 }, { "cell_type": "code", "collapsed": false, "input": [ "big.energy()" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 22, "text": [ "200000000000.0" ] } ], "prompt_number": 22 }, { "cell_type": "markdown", "metadata": {}, "source": [ "- useful to package related information in a single object\n", "- can associate specific methods without polluting the general namespace\n", "- can define rules for addition, subtraction etc..." ] }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "Scientific python: numpy and matplotlib via pylab" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "-" } }, "source": [ "\n", "For scientific applications, need to use specific packages. `numpy` is one of them, to be installed via the package manager `pip`:\n", " \n", " pip install numpy\n", " \n", "or shipped by default if python was installed with __anaconda__ (recommanded!)\n", "\n", " http://continuum.io/downloads\n", " \n", "Once installed on your system, it can be imported any time in the python console, and there are various ways of using the functions and variables defined in it." ] }, { "cell_type": "heading", "level": 3, "metadata": {}, "source": [ "pylab" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "- __`import *`__ form not recommended in general \n", "- names from numpy or other packages could silently overwrite existing variable names in current namespace\n", "- __pylab__ module is designed to safely import a selection of handy functions from __numpy__ and __matplotlib__ functions, in order to work in ways similar to matlab, without overwriting builtin python variables.\n", "- equivalent ipython form: `%pylab` or start ipython with `ipython --pylab`" ] }, { "cell_type": "code", "collapsed": false, "input": [ "%pylab" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Using matplotlib backend: Qt4Agg\n", "Populating the interactive namespace from numpy and matplotlib\n" ] } ], "prompt_number": 23 }, { "cell_type": "heading", "level": 3, "metadata": {}, "source": [ "numpy array: basic properties" ] }, { "cell_type": "code", "collapsed": false, "input": [ "array" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 24, "text": [ "" ] } ], "prompt_number": 24 }, { "cell_type": "code", "collapsed": false, "input": [ "a = array([2, 5, 7, 8, 3]) # define an array (same as np.array)\n", "a" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 25, "text": [ "array([2, 5, 7, 8, 3])" ] } ], "prompt_number": 25 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Indexing works similarly to python lists, with slicing as `start:stop:step`" ] }, { "cell_type": "code", "collapsed": false, "input": [ "a[:3] # first three elements" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 26, "text": [ "array([2, 5, 7])" ] } ], "prompt_number": 26 }, { "cell_type": "code", "collapsed": false, "input": [ "a[-3:] # last three (negative indexing)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 27, "text": [ "array([7, 8, 3])" ] } ], "prompt_number": 27 }, { "cell_type": "code", "collapsed": false, "input": [ "a[::2] # every second element" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 28, "text": [ "array([2, 7, 3])" ] } ], "prompt_number": 28 }, { "cell_type": "markdown", "metadata": {}, "source": [ "operations work as you would expect:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "array([1,2,3]) * 2" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 29, "text": [ "array([2, 4, 6])" ] } ], "prompt_number": 29 }, { "cell_type": "markdown", "metadata": {}, "source": [ "In contrast, addition and scalar multiplication mean concatenation for standard python list:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "[1, 2, 3] * 2" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 30, "text": [ "[1, 2, 3, 1, 2, 3]" ] } ], "prompt_number": 30 }, { "cell_type": "heading", "level": 3, "metadata": {}, "source": [ "generating common arrays" ] }, { "cell_type": "code", "collapsed": false, "input": [ "arange(5) # 0...4 : five elements numbered from 0, same as r_[:5]" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 31, "text": [ "array([0, 1, 2, 3, 4])" ] } ], "prompt_number": 31 }, { "cell_type": "code", "collapsed": false, "input": [ "arange(1900, 2000, 5) # alternative syntax: r_[1900:2000:5]" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 32, "text": [ "array([1900, 1905, 1910, 1915, 1920, 1925, 1930, 1935, 1940, 1945, 1950,\n", " 1955, 1960, 1965, 1970, 1975, 1980, 1985, 1990, 1995])" ] } ], "prompt_number": 32 }, { "cell_type": "code", "collapsed": false, "input": [ "linspace(-1, 1, 10) # 10 elements between -1 and 1" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 33, "text": [ "array([-1. , -0.77777778, -0.55555556, -0.33333333, -0.11111111,\n", " 0.11111111, 0.33333333, 0.55555556, 0.77777778, 1. ])" ] } ], "prompt_number": 33 }, { "cell_type": "code", "collapsed": false, "input": [ "zeros(5)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 34, "text": [ "array([ 0., 0., 0., 0., 0.])" ] } ], "prompt_number": 34 }, { "cell_type": "heading", "level": 3, "metadata": {}, "source": [ "array attributes and methods" ] }, { "cell_type": "code", "collapsed": false, "input": [ "a = ones((2,3))\n", "a" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 35, "text": [ "array([[ 1., 1., 1.],\n", " [ 1., 1., 1.]])" ] } ], "prompt_number": 35 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Arrays are objects (class instances) ! They have attributes and methods which can be accessed with the \".\" syntax:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "a.ndim # number of dimensions" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 36, "text": [ "2" ] } ], "prompt_number": 36 }, { "cell_type": "code", "collapsed": false, "input": [ "a.shape" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 37, "text": [ "(2, 3)" ] } ], "prompt_number": 37 }, { "cell_type": "code", "collapsed": false, "input": [ "a.size" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 38, "text": [ "6" ] } ], "prompt_number": 38 }, { "cell_type": "code", "collapsed": false, "input": [ "a.mean # a method, itself an object" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 39, "text": [ "" ] } ], "prompt_number": 39 }, { "cell_type": "code", "collapsed": false, "input": [ "a.mean()" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 40, "text": [ "1.0" ] } ], "prompt_number": 40 }, { "cell_type": "markdown", "metadata": {}, "source": [ "classical function approach is also defined:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "mean(a)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 41, "text": [ "1.0" ] } ], "prompt_number": 41 }, { "cell_type": "heading", "level": 3, "metadata": {}, "source": [ "multidimensional arrays" ] }, { "cell_type": "code", "collapsed": false, "input": [ "a = arange(2*3).reshape(2,3)\n", "a" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 42, "text": [ "array([[0, 1, 2],\n", " [3, 4, 5]])" ] } ], "prompt_number": 42 }, { "cell_type": "markdown", "metadata": {}, "source": [ "multi-dimensional indexing works similarly to matlab or R" ] }, { "cell_type": "code", "collapsed": false, "input": [ "a[1,0] # multi-dimensional indexing: first index for line, second for columns" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 43, "text": [ "3" ] } ], "prompt_number": 43 }, { "cell_type": "code", "collapsed": false, "input": [ "a[1] # grab the whole line" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 44, "text": [ "array([3, 4, 5])" ] } ], "prompt_number": 44 }, { "cell_type": "code", "collapsed": false, "input": [ "a[:, -1] # last column (negative integer start from the end)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 45, "text": [ "array([2, 5])" ] } ], "prompt_number": 45 }, { "cell_type": "markdown", "metadata": {}, "source": [ "`axis` parameter accepted by most transformation " ] }, { "cell_type": "code", "collapsed": false, "input": [ "a.mean(axis=0) # mean over lines" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 46, "text": [ "array([ 1.5, 2.5, 3.5])" ] } ], "prompt_number": 46 }, { "cell_type": "code", "collapsed": false, "input": [ "a.mean(axis=1) # mean over columns" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 47, "text": [ "array([ 1., 4.])" ] } ], "prompt_number": 47 }, { "cell_type": "heading", "level": 3, "metadata": {}, "source": [ "plotting" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "matplotlib is a handy plotting package. It's functions are imported via the \"magicc\" ipython command `%pylab`. Another handy command is `%matplotlib inline` to display figures inline." ] }, { "cell_type": "code", "collapsed": false, "input": [ "#%pylab\n", "%matplotlib inline " ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 48 }, { "cell_type": "code", "collapsed": false, "input": [ "x = arange(10) \n", "y = x**2\n", "\n", "plot(x, y, label='my line')\n", "plot(x, y*0.5, label='my other line')\n", "\n", "legend(loc='upper left')\n", "xlabel('x axis')\n", "ylabel('y axis')\n", "title('My Figure')" ], "language": "python", "metadata": { "slideshow": { "slide_type": "-" } }, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 49, "text": [ "" ] }, { "metadata": {}, "output_type": "display_data", "png": "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\nTkSuQmCC\n", "text": [ "" ] } ], "prompt_number": 49 }, { "cell_type": "heading", "level": 2, "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "dimarray package" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "See [installation instructions](http://dimarray.readthedocs.org/en/latest/introduction.html#installation)" ] }, { "cell_type": "heading", "level": 3, "metadata": {}, "source": [ "Concept: Provide labelled axes along with arrays" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "A **``DimArray``** can be defined just like a numpy array, with\n", "additional information about its axes, which can be given\n", "via `axes` and `dims` parameters." ] }, { "cell_type": "code", "collapsed": false, "input": [ "import dimarray as da" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 50 }, { "cell_type": "code", "collapsed": false, "input": [ "data = [[1.,2,3], [4,5,6]]\n", "a = da.DimArray(data, axes=[['grl', 'ant'], [1950, 1960, 1970]], dims=['item', 'time']) \n", "a" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 51, "text": [ "dimarray: 6 non-null elements (0 null)\n", "0 / item (2): grl to ant\n", "1 / time (3): 1950 to 1970\n", "array([[ 1., 2., 3.],\n", " [ 4., 5., 6.]])" ] } ], "prompt_number": 51 }, { "cell_type": "heading", "level": 3, "metadata": {}, "source": [ "data structure" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Array data are stored in a `values` **attribute**:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "a.values" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 52, "text": [ "array([[ 1., 2., 3.],\n", " [ 4., 5., 6.]])" ] } ], "prompt_number": 52 }, { "cell_type": "markdown", "metadata": {}, "source": [ "while dimensions are located in an `axes` attribute" ] }, { "cell_type": "code", "collapsed": false, "input": [ "a.axes" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 53, "text": [ "0 / item (2): grl to ant\n", "1 / time (3): 1950 to 1970" ] } ], "prompt_number": 53 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Individual axes can be accessed as well:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "ax = a.axes[1]\n", "ax.name , ax.values" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 54, "text": [ "('time', array([1950, 1960, 1970]))" ] } ], "prompt_number": 54 }, { "cell_type": "markdown", "metadata": {}, "source": [ "A few handy aliases are defined" ] }, { "cell_type": "code", "collapsed": false, "input": [ "a.dims # grab axis names (the dimensions)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 55, "text": [ "('item', 'time')" ] } ], "prompt_number": 55 }, { "cell_type": "code", "collapsed": false, "input": [ "a.labels # grab axis values" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 56, "text": [ "(array(['grl', 'ant'], dtype=object), array([1950, 1960, 1970]))" ] } ], "prompt_number": 56 }, { "cell_type": "heading", "level": 3, "metadata": {}, "source": [ "indexing" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Indexing works on axis values** instead of integer position" ] }, { "cell_type": "code", "collapsed": false, "input": [ "a['grl', 1970]" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 57, "text": [ "3.0" ] } ], "prompt_number": 57 }, { "cell_type": "markdown", "metadata": {}, "source": [ "but integer-index is always possible via `ix` toogle between `labels`- and `position`-based indexing:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "a.ix[0, -1]" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 58, "text": [ "3.0" ] } ], "prompt_number": 58 }, { "cell_type": "heading", "level": 3, "metadata": {}, "source": [ "enhanced numpy transformations" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Numpy **transformations** are defined, and now accept axis name:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "a.mean(axis='time')" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 59, "text": [ "dimarray: 2 non-null elements (0 null)\n", "0 / item (2): grl to ant\n", "array([ 2., 5.])" ] } ], "prompt_number": 59 }, { "cell_type": "markdown", "metadata": {}, "source": [ "They can handle nans if asked to:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "a['ant', 1950] = nan\n", "a" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 60, "text": [ "dimarray: 5 non-null elements (1 null)\n", "0 / item (2): grl to ant\n", "1 / time (3): 1950 to 1970\n", "array([[ 1., 2., 3.],\n", " [ nan, 5., 6.]])" ] } ], "prompt_number": 60 }, { "cell_type": "code", "collapsed": false, "input": [ "a.mean(axis='time', skipna=True)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 61, "text": [ "dimarray: 2 non-null elements (0 null)\n", "0 / item (2): grl to ant\n", "array([ 2. , 5.5])" ] } ], "prompt_number": 61 }, { "cell_type": "markdown", "metadata": {}, "source": [ "and many more in the doc." ] }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "Examples using dimarray" ] }, { "cell_type": "heading", "level": 3, "metadata": {}, "source": [ "Read and plot netCDF files" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We have a few netCDF files in a data folder, let's go there" ] }, { "cell_type": "code", "collapsed": false, "input": [ "import os \n", "datadir = da.get_datadir()\n", "os.chdir(datadir)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 62 }, { "cell_type": "markdown", "metadata": {}, "source": [ "List the content of the data folder (will work on unix systems only)" ] }, { "cell_type": "code", "collapsed": false, "input": [ "ls" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "cmip5.CSIRO-Mk3-6-0.nc cmip5.GFDL-ESM2G.nc cmip5.HadGEM2-ES.nc cmip5.IPSL-CM5A-LR.nc cmip5.IPSL-CM5A-MR.nc cmip5.MIROC5.nc cmip5.MPI-ESM-MR.nc\r\n" ] } ], "prompt_number": 63 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Read netCDF file to a Dataset object" ] }, { "cell_type": "code", "collapsed": false, "input": [ "datadir = da.get_datadir()\n", "ds = da.read_nc('cmip5.MPI-ESM-MR.nc')\n", "ds" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 64, "text": [ "Dataset of 2 variables\n", "0 / time (251): 1850 to 2100\n", "1 / scenario (4): historical to rcp85\n", "tsl: ('time', 'scenario')\n", "temp: ('time', 'scenario')" ] } ], "prompt_number": 64 }, { "cell_type": "code", "collapsed": false, "input": [ "temp = ds['temp']\n", "temp" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 65, "text": [ "dimarray: 909 non-null elements (95 null)\n", "0 / time (251): 1850 to 2100\n", "1 / scenario (4): historical to rcp85\n", "array(...)" ] } ], "prompt_number": 65 }, { "cell_type": "code", "collapsed": false, "input": [ "%matplotlib inline\n", "temp.plot() " ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 66, "text": [ "" ] }, { "metadata": {}, "output_type": "display_data", "png": "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\niEv9oAAAAABJRU5ErkJggg==\n", "text": [ "" ] } ], "prompt_number": 66 }, { "cell_type": "heading", "level": 3, "metadata": {}, "source": [ "Alignment features" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Load new model. Note the time axis extends until 2300 and there is one more scenario" ] }, { "cell_type": "code", "collapsed": false, "input": [ "temp2 = da.read_nc('cmip5.IPSL-CM5A-LR.nc', 'temp')\n", "temp2" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 67, "text": [ "dimarray: 1760 non-null elements (495 null)\n", "0 / time (451): 1850 to 2300\n", "1 / scenario (5): historical to rcp85\n", "array(...)" ] } ], "prompt_number": 67 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Compute reference period: reduce the time axis" ] }, { "cell_type": "code", "collapsed": false, "input": [ "ref1 = temp[1986:2005].mean(axis='time')\n", "ref1" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 68, "text": [ "dimarray: 4 non-null elements (0 null)\n", "0 / scenario (4): historical to rcp85\n", "array([ 14.48965673, 14.48965673, 14.48965673, 14.48965673])" ] } ], "prompt_number": 68 }, { "cell_type": "markdown", "metadata": {}, "source": [ "compute anomalies w.r.t reference period\n", "- automatic **dimension aligment**: never mind whether the first variable is 2-D while the second is 1-D " ] }, { "cell_type": "code", "collapsed": false, "input": [ "ano1 = temp - ref1\n", "ano1" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 69, "text": [ "dimarray: 909 non-null elements (95 null)\n", "0 / time (251): 1850 to 2100\n", "1 / scenario (4): historical to rcp85\n", "array(...)" ] } ], "prompt_number": 69 }, { "cell_type": "markdown", "metadata": {}, "source": [ "compute difference:\n", "- **automatic axis alignment**\n", "=> first time series is re-indexed to 2300 and filled with NaNs to match the second" ] }, { "cell_type": "code", "collapsed": false, "input": [ "ano2 = temp2 - temp2[1986:2005].mean(axis='time') # same as for ano1 \n", "\n", "ano1.shape, ano2.shape" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 70, "text": [ "((251, 4), (451, 5))" ] } ], "prompt_number": 70 }, { "cell_type": "code", "collapsed": false, "input": [ "difference = ano2 - ano1\n", "difference" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 71, "text": [ "dimarray: 909 non-null elements (1346 null)\n", "0 / time (451): 1850 to 2300\n", "1 / scenario (5): historical to rcp85\n", "array(...)" ] } ], "prompt_number": 71 }, { "cell_type": "markdown", "metadata": {}, "source": [ "remove nans: every scenario which does not have at least one valid value is removed => RCP6.0 is eliminated " ] }, { "cell_type": "code", "collapsed": false, "input": [ "diffvalid = difference.dropna(axis='scenario', minvalid=1)\n", "diffvalid" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 72, "text": [ "dimarray: 909 non-null elements (895 null)\n", "0 / time (451): 1850 to 2300\n", "1 / scenario (4): historical to rcp85\n", "array(...)" ] } ], "prompt_number": 72 }, { "cell_type": "code", "collapsed": false, "input": [ "#difference.plot()\n", "diffvalid.plot()" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 73, "text": [ "" ] }, { "metadata": {}, "output_type": "display_data", "png": "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\n5FPbZPrO7CO8K0xEiqCkFfQ6vXb8t99mrderHS8YZNvWfZQvmVv0eXtv6MVlcXHhjy7kO/d9h0e/\n9SgA9zx+D2uNa/nl6i8T8v4f2t9rZ926dazNiMG6O+7A+Prf4Sz48c/uJhEIsOvG/4+pxBrg+YLn\n36Z0EbmQ/aCttB6AKhAIPlp8cft29TdtbepXd+5Uf3rgwLBjP7V1q/rXnh5VVVU1LMuq5ZVX1PP+\n8hf1qbPPVtWLLlJVVVWbYzG14c03i97XFmxTrY9/Tz3jtkvV/qsuyb9w441q05NPqs2xWNH4/mi/\nys2oxz5yhXrqu++qqqqq0WRUNd9qVm/86kK198yT84PTaVXV69Wnb71CffDGs9VNy6rU373zO9Xz\n3x618keVakeoIz/24YdV9fLLtZ+//3319Ss/oX7rhW+V/KyPffCY+tnHPpt7ftVfrlJ/987vVPWZ\nZ9TAaSeqy+5Zpr2wcaOqrlypqueco8p6ST39CtR1/7hPVefMUX/yxk9URveFfFQcbppoE7AAmA2Y\ngIuBpweMqSZfM1id+Xly9zgQCARHhOwWEYvtdrZnGsgMReGcf5tOh6qqNBsMVFmtuTRRdntqtSAd\nFE6G0Zk8HN0bRz7YnD9gayuWZHJQmig7PVSOqHjC2gykrkgXVfYqXDobCV3B/VWSUG65mT/OCZFe\ntoT67hgtgRY8Vg81jhot9795s7YQrL8fMs4Ajwf8Pspt5SU/6zzPPPb059tZ+mI+vFYv9PVBefng\nNNHu3Txz9nyuXy8RjPRPyZqBDHwNeAHYBjwGbAe+lHkAXAi8D2wBfgZccpjn/MgzMEUykxGx0Jiu\ncejJioHNNrIYFNQMskXkXRYLVU5nTgxsej1s3kxIyc/XDyfDqEY3i3pCpH0F3zNbWzGXEoN4AKfJ\nSWVwHmc89xygFY+rHdW4JStxXfH4j9f+DZ8a5VOnfQlvf4xm337cFjfVjmq6+g/CmjVw8OAgMdD5\ng0U1gxz/9V/MM1Syp39PTtT6Y/05MdBVVOa3u3Y6teO2tPDYyW5WdOsJR/1TsmYA8LfMo5B7C36+\nK/MQCAQzjKwzcBkM7CgUg7fegpUri6Zx+gucAWhF5I5kkiqvNycGoE0v7Uom6U4maUsm0SUjpA1l\nLGztR/IXLARrbcVSYhvrYCLIaZEG1i05nj8/9WNAcwbV9mrKpBgxKb9eQVVV3m59m8R3Exh0BmJG\n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\nmkSYAAAAAElFTkSuQmCC\n", "text": [ "" ] } ], "prompt_number": 73 }, { "cell_type": "heading", "level": 3, "metadata": {}, "source": [ "Stack or concatenate arrays" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Instead of a difference, one could also have stacked the two models into a single array:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "newa = da.stack((temp, temp2), axis='model', align=True, keys=['MPI-ESM-MR', 'IPSL-CM5A-LR'])\n", "newa" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 74, "text": [ "dimarray: 2669 non-null elements (1841 null)\n", "0 / model (2): MPI-ESM-MR to IPSL-CM5A-LR\n", "1 / time (451): 1850 to 2300\n", "2 / scenario (5): historical to rcp85\n", "array(...)" ] } ], "prompt_number": 74 }, { "cell_type": "heading", "level": 3, "metadata": {}, "source": [ "Save data to netCDF " ] }, { "cell_type": "code", "collapsed": false, "input": [ "newa.name = 'temperature'\n", "newa.date = '22nd May 2014'\n", "newa.description = 'my dimarray test'\n", "newa._metadata" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 75, "text": [ "{'date': '22nd May 2014',\n", " 'description': 'my dimarray test',\n", " 'name': 'temperature'}" ] } ], "prompt_number": 75 }, { "cell_type": "code", "collapsed": false, "input": [ "newa.write_nc('/tmp/mydata.nc')" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 76 }, { "cell_type": "code", "collapsed": false, "input": [ "ds = da.read_nc('/tmp/mydata.nc')\n", "ds\n", "ds['temperature']._metadata" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 77, "text": [ "{'date': u'22nd May 2014',\n", " 'description': u'my dimarray test',\n", " 'name': u'temperature'}" ] } ], "prompt_number": 77 }, { "cell_type": "heading", "level": 3, "metadata": {}, "source": [ "Big data: grouping, reshaping, display" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Use regular expressions to read several netCDF files" ] }, { "cell_type": "code", "collapsed": false, "input": [ "ds = da.read_nc('cmip5.*.nc', align=True, axis='model')\n", "ds" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 78, "text": [ "Dataset of 2 variables\n", "0 / model (7): cmip5.IPSL-CM5A-LR to cmip5.CSIRO-Mk3-6-0\n", "1 / time (451): 1850 to 2300\n", "2 / scenario (5): historical to rcp85\n", "tsl: ('model', 'time', 'scenario')\n", "temp: ('model', 'time', 'scenario')" ] } ], "prompt_number": 78 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Note that all models have been automatically aligned along the longest time period (1850-2100) and with all scenarios, filling the rest with NaNs." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Export to one array and rename model axis to be more human-readable" ] }, { "cell_type": "code", "collapsed": false, "input": [ "a = ds.to_array(axis='variable')\n", "a\n", "#a['ohu',:,2100, 'rcp45']" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 79, "text": [ "dimarray: 16725 non-null elements (14845 null)\n", "0 / variable (2): tsl to temp\n", "1 / model (7): cmip5.IPSL-CM5A-LR to cmip5.CSIRO-Mk3-6-0\n", "2 / time (451): 1850 to 2300\n", "3 / scenario (5): historical to rcp85\n", "array(...)" ] } ], "prompt_number": 79 }, { "cell_type": "code", "collapsed": false, "input": [ "# rename model axis" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 80 }, { "cell_type": "code", "collapsed": false, "input": [ "def rename_axis(model_ax):\n", " return [ax.replace('data/cmip5.','') for ax in model_ax] \n", "\n", "a.model[:] = rename_axis(a.model)\n", "a" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 81, "text": [ "dimarray: 16725 non-null elements (14845 null)\n", "0 / variable (2): tsl to temp\n", "1 / model (7): cmip5.IPSL-CM5A-LR to cmip5.CSIRO-Mk3-6-0\n", "2 / time (451): 1850 to 2300\n", "3 / scenario (5): historical to rcp85\n", "array(...)" ] } ], "prompt_number": 81 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Compute 21st change (warming, sea level rise...)" ] }, { "cell_type": "code", "collapsed": false, "input": [ "change = a[:,:, 2081:2099].mean('time') - a[:,:,1986:2005].mean('time')\n", "change" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 82, "text": [ "dimarray: 47 non-null elements (23 null)\n", "0 / variable (2): tsl to temp\n", "1 / model (7): cmip5.IPSL-CM5A-LR to cmip5.CSIRO-Mk3-6-0\n", "2 / scenario (5): historical to rcp85\n", "array([[[ nan, 0.11217237, 0.1677092 , 0.17220445, 0.26592819],\n", " [ nan, nan, nan, nan, nan],\n", " [ nan, 0.12786021, 0.16702883, 0.18248119, 0.25204866],\n", " [ nan, 0.12568446, 0.17624791, nan, 0.26728292],\n", " [ nan, 0.16828752, 0.19214832, 0.20351329, 0.27523558],\n", " [ nan, 0.11636126, 0.17071112, nan, 0.27740127],\n", " [ nan, 0.15880893, 0.19516833, 0.19162792, 0.27442475]],\n", "\n", " [[ nan, 1.2443886 , 2.1304713 , 2.52817959, 4.4514311 ],\n", " [ nan, 0.26301486, 0.97925117, 1.50379534, 2.76831207],\n", " [ nan, 1.38574405, 2.5184083 , nan, 4.64571374],\n", " [ nan, 0.77803809, 1.70305479, nan, 3.49509356],\n", " [ nan, 0.999615 , 1.66958345, 1.94570811, 3.29361974],\n", " [ nan, 1.08099444, 2.24552594, nan, 4.36739709],\n", " [ nan, 1.43603482, 2.20179153, 2.4090637 , 3.98745694]]])" ] } ], "prompt_number": 82 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Use pandas to have a nice display" ] }, { "cell_type": "code", "collapsed": false, "input": [ "#rounded = change['temp'].apply(lambda x: np.round(x, 2)) # roudn to 2 decimals\n", "#rounded.to_pandas()\n", "change['temp'].to_pandas()" ], "language": "python", "metadata": {}, "outputs": [ { "html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
scenariohistoricalrcp26rcp45rcp60rcp85
model
cmip5.IPSL-CM5A-LRNaN 1.244389 2.130471 2.528180 4.451431
cmip5.GFDL-ESM2GNaN 0.263015 0.979251 1.503795 2.768312
cmip5.HadGEM2-ESNaN 1.385744 2.518408 NaN 4.645714
cmip5.MPI-ESM-MRNaN 0.778038 1.703055 NaN 3.495094
cmip5.MIROC5NaN 0.999615 1.669583 1.945708 3.293620
cmip5.IPSL-CM5A-MRNaN 1.080994 2.245526 NaN 4.367397
cmip5.CSIRO-Mk3-6-0NaN 1.436035 2.201792 2.409064 3.987457
\n", "
" ], "metadata": {}, "output_type": "pyout", "prompt_number": 83, "text": [ "scenario historical rcp26 rcp45 rcp60 rcp85\n", "model \n", "cmip5.IPSL-CM5A-LR NaN 1.244389 2.130471 2.528180 4.451431\n", "cmip5.GFDL-ESM2G NaN 0.263015 0.979251 1.503795 2.768312\n", "cmip5.HadGEM2-ES NaN 1.385744 2.518408 NaN 4.645714\n", "cmip5.MPI-ESM-MR NaN 0.778038 1.703055 NaN 3.495094\n", "cmip5.MIROC5 NaN 0.999615 1.669583 1.945708 3.293620\n", "cmip5.IPSL-CM5A-MR NaN 1.080994 2.245526 NaN 4.367397\n", "cmip5.CSIRO-Mk3-6-0 NaN 1.436035 2.201792 2.409064 3.987457" ] } ], "prompt_number": 83 }, { "cell_type": "markdown", "metadata": {}, "source": [ "can also group along all information" ] }, { "cell_type": "code", "collapsed": false, "input": [ "#rounded = change['temp'].apply(lambda x: np.round(x, 2)) # roudn to 2 decimals\n", "#rounded.to_pandas()\n", "grouped = change[:,:,['rcp26','rcp85']].group('model','scenario')\n", "grouped" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 84, "text": [ "dimarray: 26 non-null elements (2 null)\n", "0 / variable (2): tsl to temp\n", "1 / model,scenario (14): ('cmip5.IPSL-CM5A-LR', 'rcp26') to ('cmip5.CSIRO-Mk3-6-0', 'rcp85')\n", "array([[ 0.11217237, 0.26592819, nan, nan, 0.12786021,\n", " 0.25204866, 0.12568446, 0.26728292, 0.16828752, 0.27523558,\n", " 0.11636126, 0.27740127, 0.15880893, 0.27442475],\n", " [ 1.2443886 , 4.4514311 , 0.26301486, 2.76831207, 1.38574405,\n", " 4.64571374, 0.77803809, 3.49509356, 0.999615 , 3.29361974,\n", " 1.08099444, 4.36739709, 1.43603482, 3.98745694]])" ] } ], "prompt_number": 84 }, { "cell_type": "code", "collapsed": false, "input": [ "grouped.to_pandas()" ], "language": "python", "metadata": {}, "outputs": [ { "html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
modelcmip5.IPSL-CM5A-LRcmip5.GFDL-ESM2Gcmip5.HadGEM2-EScmip5.MPI-ESM-MRcmip5.MIROC5cmip5.IPSL-CM5A-MRcmip5.CSIRO-Mk3-6-0
scenariorcp26rcp85rcp26rcp85rcp26rcp85rcp26rcp85rcp26rcp85rcp26rcp85rcp26rcp85
variable
tsl 0.112172 0.265928 NaN NaN 0.127860 0.252049 0.125684 0.267283 0.168288 0.275236 0.116361 0.277401 0.158809 0.274425
temp 1.244389 4.451431 0.263015 2.768312 1.385744 4.645714 0.778038 3.495094 0.999615 3.293620 1.080994 4.367397 1.436035 3.987457
\n", "
" ], "metadata": {}, "output_type": "pyout", "prompt_number": 85, "text": [ "model cmip5.IPSL-CM5A-LR cmip5.GFDL-ESM2G \\\n", "scenario rcp26 rcp85 rcp26 rcp85 \n", "variable \n", "tsl 0.112172 0.265928 NaN NaN \n", "temp 1.244389 4.451431 0.263015 2.768312 \n", "\n", "model cmip5.HadGEM2-ES cmip5.MPI-ESM-MR \\\n", "scenario rcp26 rcp85 rcp26 rcp85 \n", "variable \n", "tsl 0.127860 0.252049 0.125684 0.267283 \n", "temp 1.385744 4.645714 0.778038 3.495094 \n", "\n", "model cmip5.MIROC5 cmip5.IPSL-CM5A-MR \\\n", "scenario rcp26 rcp85 rcp26 rcp85 \n", "variable \n", "tsl 0.168288 0.275236 0.116361 0.277401 \n", "temp 0.999615 3.293620 1.080994 4.367397 \n", "\n", "model cmip5.CSIRO-Mk3-6-0 \n", "scenario rcp26 rcp85 \n", "variable \n", "tsl 0.158809 0.274425 \n", "temp 1.436035 3.987457 " ] } ], "prompt_number": 85 }, { "cell_type": "code", "collapsed": false, "input": [ "grouped.ungroup()" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 86, "text": [ "dimarray: 26 non-null elements (2 null)\n", "0 / variable (2): tsl to temp\n", "1 / model (7): cmip5.IPSL-CM5A-LR to cmip5.CSIRO-Mk3-6-0\n", "2 / scenario (2): rcp26 to rcp85\n", "array([[[ 0.11217237, 0.26592819],\n", " [ nan, nan],\n", " [ 0.12786021, 0.25204866],\n", " [ 0.12568446, 0.26728292],\n", " [ 0.16828752, 0.27523558],\n", " [ 0.11636126, 0.27740127],\n", " [ 0.15880893, 0.27442475]],\n", "\n", " [[ 1.2443886 , 4.4514311 ],\n", " [ 0.26301486, 2.76831207],\n", " [ 1.38574405, 4.64571374],\n", " [ 0.77803809, 3.49509356],\n", " [ 0.999615 , 3.29361974],\n", " [ 1.08099444, 4.36739709],\n", " [ 1.43603482, 3.98745694]]])" ] } ], "prompt_number": 86 }, { "cell_type": "code", "collapsed": false, "input": [ "change.reshape('variable,scenario','model')" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 87, "text": [ "dimarray: 47 non-null elements (23 null)\n", "0 / variable,scenario (10): (u'tsl', 'historical') to (u'temp', 'rcp85')\n", "1 / model (7): cmip5.IPSL-CM5A-LR to cmip5.CSIRO-Mk3-6-0\n", "array([[ nan, nan, nan, nan, nan,\n", " nan, nan],\n", " [ 0.11217237, nan, 0.12786021, 0.12568446, 0.16828752,\n", " 0.11636126, 0.15880893],\n", " [ 0.1677092 , nan, 0.16702883, 0.17624791, 0.19214832,\n", " 0.17071112, 0.19516833],\n", " [ 0.17220445, nan, 0.18248119, nan, 0.20351329,\n", " nan, 0.19162792],\n", " [ 0.26592819, nan, 0.25204866, 0.26728292, 0.27523558,\n", " 0.27740127, 0.27442475],\n", " [ nan, nan, nan, nan, nan,\n", " nan, nan],\n", " [ 1.2443886 , 0.26301486, 1.38574405, 0.77803809, 0.999615 ,\n", " 1.08099444, 1.43603482],\n", " [ 2.1304713 , 0.97925117, 2.5184083 , 1.70305479, 1.66958345,\n", " 2.24552594, 2.20179153],\n", " [ 2.52817959, 1.50379534, nan, nan, 1.94570811,\n", " nan, 2.4090637 ],\n", " [ 4.4514311 , 2.76831207, 4.64571374, 3.49509356, 3.29361974,\n", " 4.36739709, 3.98745694]])" ] } ], "prompt_number": 87 }, { "cell_type": "heading", "level": 3, "metadata": {}, "source": [ "geoarray features" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's first make some 2-D data to play with" ] }, { "cell_type": "code", "collapsed": false, "input": [ "lon = linspace(-179.5, 179.5, 360)\n", "lat = linspace(-89.5, 89.5, 180)\n", "LON, LAT = meshgrid(lon, lat)\n", "values = cos(radians(LON)) + cos(radians(LAT))\n", "basic = da.DimArray(values, axes=[lat, lon], dims=['lat', 'lon'])\n", "basic.contourf(); colorbar()" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 88, "text": [ "" ] }, { "metadata": {}, "output_type": "display_data", "png": "iVBORw0KGgoAAAANSUhEUgAAAXcAAAEPCAYAAAC5sYRSAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3X20XNV93vHvNZi2+GVh4ka8SIlIDIS3SCIYOxYhF2II\nwrWwcRus5oVix8V2cBx3rQRsr7aHpk2QW1rXdQPELxhWYhnHwVSpLRuc6hostxDVkkCAghSgQRgL\nG4HBq1kNOLd/7DNo7mhm7pk5e5/923s/n7Vm3Zm5c8/eM7PPc36zz7lnQERERERERERERERERERE\nRERERERERERkqGXAZuB+YCfwmyMe9zFgN7ADWNVN10REZFpHASvr6y8H/hI4aeAxFwJfrq+/Dvhf\n3XRNRER8uQ34hYH7rgcu6bu9C1jSppGXtPljERGZyHLclMvdA/cfCzzWd3svsLRNQwp3EZFuvBz4\nAvB+4AdDfj8zcHu+TWOHtvnjeFbOw/bYnRCRNHwdmG2zgFfA/HPNH/4c8MqB+14K/CnwR7hpmUGP\n43a89iyt75va4JYiFfPwjQCL/RTwTjhndYBl16op/ubGCi5b+Idrzr61dVfezQ1T/+2Gag/rqtcM\n/d3aHbdPvdw2quugek+Uptm44vyRvxv3Wo1zPZe36dKLNt158cF3DhlTi5rw4RPZvIUX1z/vzoL2\nWTffNHHOcj/625sBbgKeAj4w4s8uBK6of74e+Gj9c2qalhkUMtg98RHsocQK9thCPO82G9/kJLDe\ntbAa+BXgHGBbfVkDXF5fwB0p8zCwB7gBeG/bRhXu/Zb/WNjlV2EXP4kQwVFqsPdYDXhvxUDlZzEj\nhV7/4vkGLmtX4namrgI24UK8/w2+AngNsAL4VttGFe7gqoZzVsMRs+HaqFr87crZF69aqdpPnT1y\nwW0LwT57RuweDH8dBl+rGA4aN31jaiJV256MccRs7hV8pxTu/YPpVbPRujHWqlmvi/NRDZ7WF1gW\ngh1g9rWxe+AMvh6ntQz3INMznseUF731r1dsSStlh3tXA6jys5jYO1GHsRLs1lh8XZKZnulRwLdS\nZrh3WRlUfhZjZTqmn8UAy5W5natVR+2oip9aeeHe5UCpumuqCXMBkTnfGz9TO1e7poCfWDnhnnAF\noOmYdFl8nZKbnulJeB2OIf9wjzUgqu6b7IrFwLLM5+tl7tNXFaFNhXwjeYZ7782PNQAqf4uyVrUr\n2OMrenqmX+z13LhEzy0zINM3N4sVUAC3URx3ioKkVcT/pDqYAZu3xOmHIemeW+acVidMC6fytyhV\n7SOsn/DxVwbpxVR8BryPc88MPe/MtCp/i/Jq8wzEPbdMFNE7MCWb4V75W5SCfcCkgT5O5LD3FfBB\nTyw2rcrforwpNNzznHOPoYrdgXCiBvt6/AZ7qGVGYG7nqpiicDfIWtXeufV0E8CRQt7a0TNe9+1U\n/hYl7Sjcfaj8LcraTtTOq/YYFXWEkI8+zRVSFbsDAgr39qrYHTiYr6q90wCyMFVioQ9TMFe9g8n1\nojQK9zYqv4uzVrV3xlqgdtQfa9W7Aj4vCvdpVbE7MFxSVbvlSjmxgE96H4sEoXA3wtJO1M6C3TrL\nG59AVL3nQ+E+jcrv4oqbjkktMAP3N/vqvYrdgTIp3CdVxe7AcMlU7akFe09BAR+k2Kj8LzIhnwb2\nAfeNecws7ouzdwJzPhpVuE+i8r9IS1W7gn0Rqfd/Agp4r24ELhjz+yOA/wq8GTgV+Mc+GlW4N1XF\n7sBoZj+O98slGAM+D0vVu3h1F/D0mN//U+BPgb317e/5aFTh3kQVZrHFVO25BHtPAgHvg6r3zhwP\nHAlsBrYCv+pjoQr3SHytOOartNyCvcf48zI9LqrYHTDnpcDpwIXALwL/Ehf4reRxPveQqtgdGM38\nTlTjAdjaeoKcYdLSud/XnH2r37NG9lSYXreGWb1u+P1z+2Duyb47dk686MdwUzF/U1/uBFYAuyde\nUh9V7uNUYRZbxHRM7sHeY/h5+tr4BxuvVZjFdm12CVSnHbhM4b/hzhR8CHA48Drggbb9UriPUsXu\nwHimP3YbDrwgAjxfS3PvQVWxO9CJDcA3gRNxVfo7gMvrC8Au4CvAvcDdwCdQuAdShVt09lV7acFu\nnPnqHUoI+HXAMcBhwDLcce831Jee/wCcApwGfMxHowr3QVW4RRezE7VEqt7bqWJ3ID8K935V7A50\nR1V7AEYDPonqHYpa/7qgcO+pwi4++6q99GDvMfo6KODLo3CvKG5Aea/ajQZaNJ5fj6KmZ6C49TGU\nssO96qYZS1V7cUEhL0qmeociiy7fyg33qptmLB0dE4Sq9uFUvftRxe5AusoM9yp2ByZnsmpXsI9n\n8PVJqnrvqbprKidlhXtFpwMl66rdYHDlzlr13nnAV901l4Nywr2K3YHpmazapRmDG0GzR1w1UcXu\nQDryD/eKKANCVbu8yOPrZW0jHWWcVyjkG8g33CuiDQCfA15Vu4SQdPXeU6GQHyOvcK/QGx6aqvbp\nqHoPp0Lr/RAzkdt/FHgW+CHwPHAm7htJbgF+vP79LwHPDPzdPF+f76yTk8i6ajcc7Fs2HLg+6rzb\n0Xk897uv871f/+KJCdsLct53H35+Btpn3fx8w3E148Zi7GyN/mUd87hv/d7fd99VwB3AR3Crw1X1\nRQRYGORNf28i8D1+uYelL/QQm2JvXR4BzgCe6rtvF/DzwD7gKGAO+KmBvzNZuatqD2exQJ9E9KD3\nFPCq3hsqtHKPPec+D3wN96Ww76rvW4ILduqfSyL0a2LR5x0ztWWD32APtcwYrM29iy2xw301sApY\nA/wG8HMDv5+vL0VR1d5NAEcLeWP7LnweOaMix47Yc+5P1D+/C3wRt0O1Nx3zHeBo4Mmhf3ljdeD6\nyllYNRuqj4vKekBHCvau24s+VTMlzb0PsW0Ots/F7kV0McP9cNwXwj4HvAw4H7ga2AhciouVS4Hb\nhv71ZVUXfexcFscfTynmVEnnAe9x56o1a86+Ne7c+6rZhcXeZ66O1ZOoYk7LLAHuArbjvhT2vwO3\nA9cA5wEPAefWt82yWLV7m5LpsGq3MAee6ly8pW9r6rG4XkT0adyMxH0jfv/LwA7cF2RvAX7aR6Mx\nw/0RYGV9ORX4/fr+/cAbgRNw1fzgMe5m+B7ApVbt1gK1s/4Ym3uXYG4ELhjz+4eBs3Gh/rvAH/po\nNPYOVfEstardWrD3WO3XKKreTbsLeHrM7/8n8P36+t3AUh+NKtynpKq9PesB2kn/VL3LQu8Evuxj\nQQr3jKRUtVsP9p5U+umLqvfJze2D6r4DlxbOAd6Bp13tsQ+FTFIJAzak0gJzUZ6OnLF6WGT0o2d8\nGfEezdaXnqtXTrX0nwY+gZubHzeF05gq9wmFCHZTUzKBq/YUgz3FPrdhajyW4ceAW4FfAfb4WqjC\nPRP6V/Swgge8p42q1XFQ+KfdDcA3gROBx3BTL5fXF4B/BbwKuA7YBtzjo1FNy0wg+6o9sNQr4JT/\nk1WiWmzU/Hp98UqVewZS2JGaerD3BH0eho6cCVF0FF69d07h3pCqdkmF1akZUMB3SeHeQBEDUlV7\nY7k9n1FUfKRN4Z44y1Ua5BuEwZ5X5jtWoZBiyQCF+yJCDURTVZGhuV4R8UPhLsHkWrX3WK/efQhV\nhKh6D0/hPob1AWj5o3fuwZ4Cy+MD7K9fqVO4R6ApmXyUsBEzNV6lMYX7CNarCstVWQmBF1whG13r\n61nKFO5DhBxwqoLyY3ljZrkIkLAU7iULUB1aDrrkGKreQxYlqt7DULgP0ECTaWij1o7WO/8U7h3y\nVf1Y/aitgLPJ6niRsBTufYqqHgx95M9F7hu30PuLilr/OqBwr2lgiUnaCMuUFO4d0ZRMGfQ6tKMi\nyx+FOwUOKFWDxfFVFHRxKG9x62MgCndpTdVqYNoYyxSKD/cuqoTcp2RkIW3s2lP13l7R4a4BJCVJ\naWomQxcAu4DdwJVDfv9q4CvAdmAn8M/aNlh0uBfJ80d8VanD6XVpL6Pi6xDg47iAPxn3hdknDTzm\nCmAbsBKYBa4FDm3TaLHhntHAkRIUOu+eyXp6JrAHeBR4HvgccNHAY54AXllffyXwFPBCm0aLDfeu\n6COs5EjjeiLHAo/13d5b39fvE8ApwLeBHcD72zbaquxPVYrVgMWdqZp6kC6sOftWNt15cexujDT3\nFzC3dexD5hss5kO4+fZZ4CeBO4AVwHPT9qu4cE8x2L0p9KN9LFs2wOp1sXux0Nodt7Nxxfmxu5Gk\nka/bCjj91/tu33BQIfY4sKzv9jJc9d7vDcC/q6//FfAIcCIwfrMxhqZlAtJHV/Gq4I1z4kXZVuB4\nYDlwGHAJsHHgMbuAN9bXl+CC/eE2jRYV7okPEFM0JSNdFy8Jr78v4I6G+SrwAHAL8CBweX0B+D3g\nDNx8+9eA3wH2t2m0uGmZFFmcb5dmLE7NSBSb6ku//q3j94A3+2ywmMo94a2+HwV/pJeFUi4Wil+P\nJ1BEuGtAiEhpigj3GHLemar59oj0CUzFWkPZh7sGgsSW88YwVhGj9Xpx2Ye7iEiJsg73HLbuKe/8\nEgkph/U7pGzDXW98H83TihQn23CPKeedqZKHXD4RqogbLctw1xseTs47B5OhT2ILaH0fLstwF7Em\n542iPqnalF24aysuUh6t9wfLKtz1BouIOFmFu4iUS8XdQtmEu95YEVEOHJBNuOcol8PVRKR7WYS7\nttYi0qM8cJIPd2tvZM6HheV8OJ9IbpIPd1mE/uFFRsh52s9a0RdD0uGuN1BERik9H5qE+7DaL3Q9\neAHu28B3A1cGbktEJLSmmfZa3BdqX9y2wSbhfv6Q+y5s2/AYhwAfx70YJwPrgJMGH1T6VllEFmck\nJxplWv249cBXgJm2jY4L9/cA9wEn1j97l0eBe9s2PMaZwJ66neeBzwEXBWxPpBM575DO+UACD5pm\n2vuALwDf9dHooWN+91lgE3AN7mNEb0vyHPCUj8ZHOBZ4rO/2XuB1AdsTEQmpSaYdiwv8c3FTM/Nt\nGx0X7t+vL2+vb/8o8PeBl9WXv27b+AiNntTu6pYXrx85ewo/MntqoO6ISEqemtvJ/rn7O2vvvrn9\n7JzbP+4hTTLto8BV9WNn8DAtMy7ce9YC1wLHAE8CPw48CJzStvERHgeW9d1ehtvSLXB8dUmg5kUk\nZT8ye+qCYm/P1Z/3stzruXz4L2brS8/Vbxt8RJNM+xncdA3Aq4E1uCmcjVN0FWi2Q/XfAj8LPAQc\nB/wCcPe0DTawFTgeWA4cBlxCiycoYsXqdbF7IJE0ybSfwOXrcbh59/cMecxEmoT788D36sceAmwG\nzmjT6CJeAK4Avgo8ANyC+6QgIkaNrGoj23Rn6yMKfRiVaZfXlyCaTMs8DbwCuAv4Y9zUzA9Cdai2\nqb6MfsCdF1s5zElEZDHDMm3UIUaX+WiwSeX+FuD/Ah/AHX+5B3izj8bbMrJVFhGDSs+HJpV7r0r/\nIfCZcF2RIK5E55eRoTauGPb/iZKLcZX7D3DHtA+7PBu+a82UvnXuknYISiqUC+PD/eW4ufZhl1eG\n71qarO5YEimFgt1J+qyQPXozRUQWyiLcIc+A15yoyGRyzIFpZRPuIiJyQFbhrq22SLm0/i+UVbiL\nSJkU7AfLLtz1JotFOoxUupZduIMCXjJn7IsnYx/+q/V9uCzDPbbYgz0kVaAiacg23LU172Os0pP4\ncjnMVuv5aNmGey5yWQlFfFOwj5d1uOvNF5FSZR3uoICX+HLeTxFr/5LW68VlH+7iX85hJZKLIsI9\nxlY+5yNmJCLtHFfV3lAR4S4oFORFKe+kV7A3V0y4pzwoUl4ZS6cpLKldAOwCdjO61PpY/fsdwKq2\nDRYT7uKXQku6nnpMuEA7BPg4LuBPBtYBJw085kLgNcDxwD8HrmvbaFHh3vXg0Ly7iABnAnuAR4Hn\ngc8BFw08Zi1wU339buAIYEmbRosKd0h66y+lK3i/SeLr7bHAY32399b3LfaYpW0aPbTNH0tirgTW\nx+5EOSxOXaW4/8Z6sD81t5P9c/ePe8h8w0XNTPl3QxUZ7pvuvJg1Z98auxsT2bjifNbuuD12NxZY\nvQ62bIjdC4mhxCnHkRuZl1wM5/bdvvrzg494HFjWd3sZrjIf95il9X1TK25apmslrgQivliv2hva\nittRuhw4DLgE2DjwmI3Ar9XXXw88A+xr02ix4Z7JoBGjvE/JFDzfnoEXgCuArwIPALcADwKX1xeA\nLwMP43a83gC8t22jxYY7FBrwnkPC4ryyDOdrvr2rT6OZrZ+bgBNxhzv+fn3fDfWl54r69yuAb7Vt\nsOhw74qvlSHFnWEi08gs2KMoPtw1iNpT9b6QXg+xoPhwL5Lmb9NS2PulgssPhTvdDCYdNVMGq1V7\navPt0p7CvZZKtWB13t1qqElaUlkPU6BwF7GsoCkZBbtfCvc+oQeXqY+0AUKj9Ord6vPXlEyZFO4J\nsjo1IzItVe3+KdwHaJC1Y7V6DS3I8y5oSkb8U7gPETLgTX20VXhkL4UpGRVUYSjcE2V5aqa06r20\n5+uTgj0chfsIxQw6Ve82GXpfTH3alMYU7hGUsLKUUs1afp6WP91BQQVUJAr3MawPPusrb+6CBbuh\nql3SpXBfRKiAN1W9BwoTy1WtNBNqnFovnHKgcJegcg14689Ln+pE4d6A5SrD20qsqQAbDL0PqtrT\npnCPyNTUTEDWq9xJ5fZ8uqRg747CvSHLgzKFj+C5BGLQ5+Gpak9hPEh4CvcJhAh4U9W7oSkBi3LZ\nQDURYlxaLpAiOhK4A3gIuB04YsxjDwG2AX/WZMEKd+lMSeE4MVXtpboKF+4nAH9e3x7l/cADwHyT\nBSvcJ2S1+khlx2qqAZ9qv6ehqr1Ta4Gb6us3AW8Z8bilwIXAJ4GZJgtWuBtgamqmA6kFZWr9tUbB\nPtYSYF99fV99e5j/BPw28HdNF3xou36VadOdF7Pm7Ftjd+MgG1ecz9odt7df0JXA+vaLGWf1Otiy\nIWwbPnQS7IamZEorNCZSjbj/6Tl4Zm7cX94BHDXk/g8P3J5n+JTLPwKexM23z45rqJ8q9yn5rkZK\nXKmsV8TW+5eCIqr2V83CcdWBy8HOA04bctmIq9Z7wX80LsQHvQE3ffMIsAE4F7h5sW7FCvcK2Ivb\nEm0D1vT97oPAbmAXoL1DE0pl7r3HaoB21i9DVbtEsRG4tL5+KXDbkMd8CFgGHAe8HfgfwK8ttuBY\n4T4P/EdgVX3ZVN9/MnBJ/fMC4A8w/OlC1bsf1gLeWn+64nv8FVG1t3cNrrJ/CFeRX1PffwzwpRF/\nY/5omWF7fC/Cfex4HngU2AOc2WGfpF+Hx71bCdRO+5Fx1a5gb2w/8EbcoZDnA8/U938beNOQx38d\nN0WzqJjh/j5gB/ApDhy4fwxuuqZnL3Bsx/2aiMXq3eLK3kTsgI/dfkylfmrMWchwvwO4b8hlLXAd\nbv5oJfAEcO2Y5TT6CBJT1lVKx/+1unpd9yEbo01V7RJayEMhz2v4uE9y4N9pH8ftOOhZWt93sBur\nA9dXzsKq2cl6Z9j1XM67uaHVMrwdFhlJV4dKRqnWjZ3mIbuqfdscbJ+L3YvoYh3nfjSuYgd4K66i\nB7fn+LO4na3HAscD9wxdwmVV0A5Oyuqx7150cNz7ML3gDRHyJU/BhGSial81u7DY+8zVsXoSVaxw\nX4+bkpnHHbvZKx0eAD5f/3wBeC8JTMtYlXr13uMr5E0Euseq3do/LZkIdnlRrHAfd4zm79WX5Pis\n3n1MzXgVqXrvNxjOTcLeRKCLRNDoBDQGzXPOQEFfRenHUL4C3le4e63eIwd80lS1d6MauL15Btpn\n3cGZM4qf9lrL59wy1YjrCTNXvYtYVcXugD1m//uzlYqob7apKgbPh8sZO9IjGaraw6hQsI+QZ7j3\nVCT/xps8TE0BP5mMX69owV6R/LodWt7h3lPR+UDIunqXaKxV7Z2rUKg3VEa491TdNucr4E2ujBlX\no15l/Dp1XsBU3TaXurLCHYoeIN6r94yDywvPr0+xVXtF0evttMoLd+h0sGRdvUtnrE2rdVa1V900\nk6Myw72nit2ByZg8Y6Sq9+EMvi6+CgQFexrKDnfoZABZ27nqncEgi8rgdExyqtgdSJ/CHZIKeJPV\nuxxgdEOXVNVehW+iBAr3nip2BxJnNNRSV9SGuELroUcK935V2MVnX72XHvBGn38SVXsVbtGlUrgP\nqmJ3oDsKeI8CPG9LVbuCPZgjcd9a9xBwOwe+cnTQB4H7cd998Vng7y22YIX7MFW4RVuq3oMpLeAN\nP1/T4wRKD3aAq3DhfgLw5/XtQcuBdwGnA6cBhwBvX2zBCvdRqnCLtnT0TLDq0HDgeRXoeRZTtcta\n4Kb6+k3AW4Y85lngeeBw3Jl8D2fU14/2UbiPU8XuwHjmq7LcGQ928+Ojit0BE5YA++rr++rbg/YD\n1wJ/DXwbeAb42mILzud87qFUBBmElr5zNdjX8Rn49qZgjH8yMb8TtQqz2KA2bxnxi28B28b95R3A\nUUPu//DA7XmGf63oTwK/hZue+T7wJ8AvA388rlFV7k1UsTswmq+VWNMzEwj4nIqYjqnCLDae04F3\n9l0Och5urnzwshFXrfeC/2jgySF/fwbwTeAp3HdL3wq8YbFeKdybqvwvspi5zJwCPoHnYno6pord\nAXM2ApfW1y8FbhvymF3A64F/gPv6vjcCDyy2YIX7JCr/i/QR8Oard0giFBcV+DlkX7VX/heZgWtw\nlf1DwLn1bYBjgC/V13cANwNbgXvr+/5wsQUr3CdVxe7AcKartZ6UAz6RYDc7DqrYHTBrP64SPwE4\nH7ezFNyO0zf1Pe4jwCm46ZxLcUfPjKVwN8DS9Ezw6vFK0gv51PrbkvfxWPldnDSjcJ9GFbsDwyUx\nPdOTSmB20E9LVbulQkPaUbhPq/K7uCJXKusBX1iwB1HF7kC5FO5tVH4XV8zO1X4Wp2ks9qkDmo7J\ni8K9rSp2B8Lp9OgNK2HaYT+yrtqr2B0Qhbsxlqr3zsWsmDtu29Jhj+C5aq/8LUqmp3D3oYrdgYMl\nNz3Tr8ugTXwKRjtRZRSFuy+Vv0VZW9miVZkhgzdiqFur2r2qYndAemZid2BK85wz7Pw6BlT+FuXj\nxGLv5gYPPXGCnFxsUm1ORGagQvcZ7Oaq9srforzaPAPts24evtHwoWf5aK81nRVS0jIqoNc3eExk\n1oLdqyp2B2RQ9K3LlEZvRc9Z3W1Phqn8LUrVez6shXt2VfvIU/J6qaSTq9yjd2BKzV7omEFf+VmM\nr3O+K+DjUrAHMjLQ+5UZ7nnvUN28peGbb5e1nauQ+Q7BALJ+vapI7WawboeWd7j3xBgIlb9FFX3s\ne+J8B7u5qr1rCvXGygj3nq4HRtVdU13Luho1ytwGuuqwLYX6xMoK954EA95i9a6AH8/i6+Otaq/8\nLKYRhfpUygx3KLYSUMB3Q9MxHhS6jvpSbrj3dDF4Kj+LsbpyKuAXshjsXlUdtKFQb03hDsUFvLmw\nyIjVDV1S0zFlBfs/Ae4HfgicPuIxy4DN9eN2Ar/ZZMEK957NW+Dpudi9GG7bnPdFtg34++b2L7ht\nIdTm/iJu+6Neg8HXahLBNsTTjKnKdycGbP4vpQU7wH3AW4E7xzzmeeADuO9QfT3wG8BJiy1Y4d5v\n+81hB1c15d9tn1tw08L0zM4hgRU74Oe2Rm1+pGGvVZeGjpeBMRXd5i3Atti9iGEX8NAij/kOsL2+\n/gPgQeCYxRascB/GYsAHEKIqjB3wsYR43qZ2olZ+FjNUedV6G8uBVcDdiz1Q4T6K8QFnoXofpbSA\ntxrs3lQBl218PfPkDtz0y+DlzRMu5+XAF4D34yr4LM0B87rooosuDS5ztDdJe89OsfzNjN6hCvBS\n4KvAbzVdYKqn/J2N3QERKUoXJwIb1cYM8CngAeCjHfRDRERaeivwGPA3uB2nm+r7jwG+VF8/C/g7\n3E7VbfXlgm67KSIiEtmofx5YjtuK9raQf9D3u5/B7QjZDfznDvsE8MG63V1A/x680H3qVwF7OfDa\nrGnQv65cULe9m7jfxfQocC/u9bmnvu9I3E61h4DbgSMC9+HTwD7cuOgZ14eu3rth/aqwO6YkUT8F\nnMDBOzKWs3Dw9bsHOLO+/mX8fzQa1aeTcR/JXlr3bw8H5udC96nfvwb+xZD7h/WvyyOxDqnbXF73\nYTsN/skjkEdwQdrvI8Dv1NevBK4J3Iefwx0u1z+OR/Why/duWL+sjqnklfxiNfnngX5HA6/gQDV2\nM/CWjvp0EbAB959qj+IG+us66tOgYTt9hvXvzCGPC+XMus1H6z58ru5TLIOv0Vrgpvr6TYR/j+4C\nnm7Yhy7fu2H9AptjKnklh/s4x+E+Is5Rf2cWcCzu42PP4/V9XThmoO29dduD93fRp/cBO3B773sf\n7Uf1ryvH4nZKxWq/3zzwNWAr8K76viW46Qjqn0si9GtUH2K/d2BzTCUv1UMhm7oDOGrI/R8C/mzE\n33wbd6Kep3FTI7fhzukQs09dGtW/DwPXAf+mvv27wLXAO0csZ95/10bqsq3FrAaeAP4h7rXcNfD7\n3rHQMS3Why77Z3VMJS/3cD9vir/52/oC8C3gr4DjcVXx0r7HLa3v66JPj+M2OP1t7/XYp35N+/dJ\nDmyMhvWvbT8mMdj+MhZWfV16ov75XeCLuKmEfbgN5ndwU2lPRujXqD7Efu/6XwtLYyp5mpZx+uf8\nXo3bQQfwE7hgfxi30j6Lm+ueAX4VV9V30aeNwNuBw3BTRsfj5tm/03Gfju67/lYO7Bgb1b+ubK3b\nXF734ZK6T107HLcPBOBluCM87qv7cml9/6WEfY9GGdWH2O+d1TElCRv1zwNvw50zeRvwv4E39f1N\n77DDPcDHOuwTuGmbPbiP+b/YYZ/63Yw7zG8HLhz6545H9a8ra4C/rPvwwQjtgwuh7fVlZ18/jsTN\nw3d1KOQG3PTi3+LG02WL9KGr926wX+/A9pgSERERERERERERERERERERERERERERaSrb748U8UX/\noSop0jnabmCHAAAAz0lEQVRGRBahcJeUzQD/HvcfuvcCv1TfP4s7o+efAA8CfxShbyIiMqHn6p9v\nw/0r/Qzwo8D/wZ0caxZ4Bnfa2Bngm7izNYoUQ5W7pOws4LO4aZonga8Dr61v34M7j8k87lwvy+N0\nUSQOhbukbJ6Dv8WnNx////ru+yH5n95aZAGFu6TsLtzpfV+C+3KMs3EV+7CvbRMpiqoZSVGvOv8i\n8LO408XOA7+Nm545iYOPqNERNiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIr78f56R/ZhVA/PZ\nAAAAAElFTkSuQmCC\n", "text": [ "" ] } ], "prompt_number": 88 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now, that's let's compute the global mean with the standard dimarray method:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "basic.mean()" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 89, "text": [ "0.63662785266740252" ] } ], "prompt_number": 89 }, { "cell_type": "markdown", "metadata": {}, "source": [ "But in reality, high-latitude values are down-weighted because of the smaller surface they occupy. GeoArray is a subclass of DimArray that handles that recognizes typical dimensions and apply the desired weighting. " ] }, { "cell_type": "code", "collapsed": false, "input": [ "from dimarray.geo import GeoArray\n", "geo = GeoArray(basic)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 90 }, { "cell_type": "code", "collapsed": false, "input": [ "geo.mean()" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 91, "text": [ "0.78538819485364419" ] } ], "prompt_number": 91 }, { "cell_type": "markdown", "metadata": {}, "source": [ "It does little more than defining the axis attributes `weights`, here a lambda function..." ] }, { "cell_type": "code", "collapsed": false, "input": [ "geo.axes['lat'].weights" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 92, "text": [ ">" ] } ], "prompt_number": 92 }, { "cell_type": "markdown", "metadata": {}, "source": [ "that is called on every axis value when needed" ] }, { "cell_type": "code", "collapsed": false, "input": [ "geo.axes['lat'].weights(geo.lat)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 93, "text": [ "array([ 0.00872654, 0.02617695, 0.04361939, 0.06104854, 0.0784591 ,\n", " 0.09584575, 0.11320321, 0.13052619, 0.14780941, 0.16504761,\n", " 0.18223553, 0.19936793, 0.21643961, 0.23344536, 0.25038 ,\n", " 0.26723838, 0.28401534, 0.3007058 , 0.31730466, 0.33380686,\n", " 0.35020738, 0.36650123, 0.38268343, 0.39874907, 0.41469324,\n", " 0.4305111 , 0.44619781, 0.46174861, 0.47715876, 0.49242356,\n", " 0.50753836, 0.52249856, 0.53729961, 0.55193699, 0.56640624,\n", " 0.58070296, 0.59482279, 0.60876143, 0.62251464, 0.63607822,\n", " 0.64944805, 0.66262005, 0.67559021, 0.68835458, 0.70090926,\n", " 0.71325045, 0.72537437, 0.73727734, 0.74895572, 0.76040597,\n", " 0.77162458, 0.78260816, 0.79335334, 0.80385686, 0.81411552,\n", " 0.82412619, 0.83388582, 0.84339145, 0.85264016, 0.86162916,\n", " 0.8703557 , 0.87881711, 0.88701083, 0.89493436, 0.90258528,\n", " 0.90996127, 0.91706007, 0.92387953, 0.93041757, 0.93667219,\n", " 0.94264149, 0.94832366, 0.95371695, 0.95881973, 0.96363045,\n", " 0.96814764, 0.97236992, 0.97629601, 0.9799247 , 0.98325491,\n", " 0.9862856 , 0.98901586, 0.99144486, 0.99357186, 0.9953962 ,\n", " 0.99691733, 0.9981348 , 0.99904822, 0.99965732, 0.99996192,\n", " 0.99996192, 0.99965732, 0.99904822, 0.9981348 , 0.99691733,\n", " 0.9953962 , 0.99357186, 0.99144486, 0.98901586, 0.9862856 ,\n", " 0.98325491, 0.9799247 , 0.97629601, 0.97236992, 0.96814764,\n", " 0.96363045, 0.95881973, 0.95371695, 0.94832366, 0.94264149,\n", " 0.93667219, 0.93041757, 0.92387953, 0.91706007, 0.90996127,\n", " 0.90258528, 0.89493436, 0.88701083, 0.87881711, 0.8703557 ,\n", " 0.86162916, 0.85264016, 0.84339145, 0.83388582, 0.82412619,\n", " 0.81411552, 0.80385686, 0.79335334, 0.78260816, 0.77162458,\n", " 0.76040597, 0.74895572, 0.73727734, 0.72537437, 0.71325045,\n", " 0.70090926, 0.68835458, 0.67559021, 0.66262005, 0.64944805,\n", " 0.63607822, 0.62251464, 0.60876143, 0.59482279, 0.58070296,\n", " 0.56640624, 0.55193699, 0.53729961, 0.52249856, 0.50753836,\n", " 0.49242356, 0.47715876, 0.46174861, 0.44619781, 0.4305111 ,\n", " 0.41469324, 0.39874907, 0.38268343, 0.36650123, 0.35020738,\n", " 0.33380686, 0.31730466, 0.3007058 , 0.28401534, 0.26723838,\n", " 0.25038 , 0.23344536, 0.21643961, 0.19936793, 0.18223553,\n", " 0.16504761, 0.14780941, 0.13052619, 0.11320321, 0.09584575,\n", " 0.0784591 , 0.06104854, 0.04361939, 0.02617695, 0.00872654])" ] } ], "prompt_number": 93 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Additionally, there is a `modulo` attribute that ease indexing:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "geo.axes['lon'].modulo" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 94, "text": [ "360" ] } ], "prompt_number": 94 }, { "cell_type": "code", "collapsed": false, "input": [ "geo[:,[280.5]]" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 95, "text": [ "geoarray: 180 non-null elements (0 null)\n", "0 / lat (180): -89.5 to 89.5\n", "1 / lon (1): -79.5 to -79.5\n", "array(...)" ] } ], "prompt_number": 95 }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "application: warming tool" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Example of application using dimarray: http://54.72.92.185/choices" ] }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "Useful links" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "[An Informal Introduction to Python](https://docs.python.org/2.7/tutorial/introduction.html)\n", "\n", "[scipy.org](http://scipy.org): list major packages for scientific use\n", "\n", "[dimarray code](https://github.com/perrette/dimarray)\n", "\n", "[dimarray doc](http://dimarray.readthedocs.org)" ] } ], "metadata": {} } ] }