{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "\n", "
\n", "\"Unidata\n", "
\n", "\n", "

Primer

\n", "

Unidata Python Workshop

\n", "\n", "
\n", "
\n", "\n", "
\n", "\n", "
\"NumPy
\n", "\n", "\n", "## Overview:\n", "\n", "* **Teaching:** 15 minutes\n", "* **Exercises:** 15 minutes\n", "\n", "### Questions\n", "1. What are arrays?\n", "2. How can arrays be manipulated effectively in Python?\n", "3. How do we work with unit information with MetPy?\n", "\n", "### Objectives\n", "1. Slice and index the array\n", "2. Perform a meteorological calculation on an array of data using MetPy.\n", "3. Use advanced methods to index into arrays\n", "\n", "### Resources\n", "- [MetPy Documentation](https://unidata.github.io/MetPy/)\n", "- [MetPy Calculation List](https://unidata.github.io/MetPy/api/generated/metpy.calc.html)\n", "- [MetPy Constants](https://unidata.github.io/MetPy/api/generated/metpy.constants.html)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## 1. Index and slice arrays\n", "\n", "Indexing is how we pull individual data items out of an array. Slicing extends this process to pulling out a regular set of the items." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "# Convention for import to get shortened namespace\n", "import numpy as np" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [], "source": [ "# Create an array for testing\n", "a = np.arange(12).reshape(3, 4)" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/plain": [ "array([[ 0, 1, 2, 3],\n", " [ 4, 5, 6, 7],\n", " [ 8, 9, 10, 11]])" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "a" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Indexing in Python is 0-based, so the command below looks for the 2nd item along the first dimension (row) and the 3rd along the second dimension (column)." ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/plain": [ "6" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "a[1, 2]" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Can also just index on one dimension" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/plain": [ "array([ 8, 9, 10, 11])" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "a[2]" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Negative indices are also allowed, which permit indexing relative to the end of the array." ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/plain": [ "3" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "a[0, -1]" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Slicing syntax is written as `start:stop[:step]`, where all numbers are optional.\n", "- defaults: \n", " - start = 0\n", " - end = len(dim)\n", " - step = 1\n", "- The second colon is also optional if no step is used.\n", "\n", "It should be noted that end represents one past the last item; one can also think of it as a half open interval: `[start, end)`" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "data": { "text/plain": [ "array([[ 4, 5, 6, 7],\n", " [ 8, 9, 10, 11]])" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Get the 2nd and 3rd rows\n", "a[1:3]" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/plain": [ "array([ 2, 6, 10])" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# All rows and 3rd column\n", "a[:, 2]" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/plain": [ "array([ 2, 6, 10])" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# ... can be used to replace one or more full slices\n", "a[..., 2]" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[ 0, 1, 2, 3],\n", " [ 8, 9, 10, 11]])" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Slice every other row\n", "a[::2]" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[ 0, 2],\n", " [ 4, 6],\n", " [ 8, 10]])" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Slice out every other column\n", "a[:, ::2]" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [], "source": [ "# Slice every other item along each dimension -- how would we do this\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 2. Use units from MetPy with calculations" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [], "source": [ "# Import MetPy's units registry\n", "from metpy.units import units" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "64 foot ** 2\n" ] } ], "source": [ "length = 8 * units.feet\n", "print(length * length)" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0.6666666666666666 mile / minute\n", "17.8816 meter / second\n", "40.0 mph\n" ] } ], "source": [ "distance = 10 * units.mile\n", "time = 15 * units.minute\n", "avg_speed = distance / time\n", "print(avg_speed)\n", "print(avg_speed.to_base_units())\n", "print(avg_speed.to('mph'))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 3. Perform meteorological calculations using MetPy" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [], "source": [ "np.random.seed(19990503) # So we all have the same data\n", "u = np.random.randint(0, 45, 10) * units('m/s')\n", "v = np.random.randint(0, 45, 10) * units('m/s')" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ 14. 2. 44. 37. 35. 37. 8. 25. 22. 10.] meter / second\n", "[ 23. 27. 5. 0. 38. 23. 27. 8. 8. 40.] meter / second\n" ] } ], "source": [ "print(u)\n", "print(v)" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [], "source": [ "import metpy.calc as mpcalc\n", "\n", "speed = mpcalc.get_wind_speed(u, v)\n", "direction = mpcalc.get_wind_dir(u, v)" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ 26.92582404 27.07397274 44.28317965 37. 51.66236541 43.56604182 28.16025568 26.2488095 23.40939982 41.23105626] meter / second\n", "[ 211.32869287 184.2363948 263.51692631 270. 222.64670313 238.13402231 196.50436138 252.25532837 250.01689348 194.03624347] degree\n" ] } ], "source": [ "print(speed)\n", "print(np.rad2deg(direction))" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "34.95609049170319 meter / second\n" ] } ], "source": [ "print(np.mean(speed))" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "228.2675566116978 degree\n", "29.27089778050201 degree\n" ] } ], "source": [ "print(np.mean(np.rad2deg(direction)))\n", "print(np.std(np.rad2deg(direction)))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's use MetPy to calculate the dewpoint from the current temperature and relative humidity:" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "data": { "text/html": [ "20.264799097790046 degC" ], "text/latex": [ "$20.264799097790046\\ \\mathrm{degC}$" ], "text/plain": [ "" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import metpy.calc as mpcalc\n", "mpcalc.dewpoint_rh(25 * units.degC, 0.75)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Thanks to units, this can work with Fahrenheit as well:" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "data": { "text/html": [ "20.26479888333684 degC" ], "text/latex": [ "$20.26479888333684\\ \\mathrm{degC}$" ], "text/plain": [ "" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "td = mpcalc.dewpoint_rh(77 * units.degF, 0.75)\n", "td" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "And you can get it back in Fahrenheit as:" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "data": { "text/html": [ "68.47663839000624 degF" ], "text/latex": [ "$68.47663839000624\\ \\mathrm{degF}$" ], "text/plain": [ "" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "td.to('degF')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "MetPy also has a library of useful constants, similar to those in `scipy.constants`, that are important for meteorology and have appropriate dimensionality included:" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [], "source": [ "import metpy.constants as consts" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can look at the docstring for the module (or go to the web documentation) to see a list of the available contants:" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [], "source": [ "consts?" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "So for the density of liquid water (nominally at 0C), we can use:" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "data": { "text/html": [ "1000.0 kilogram/meter3" ], "text/latex": [ "$1000.0\\ \\frac{\\mathrm{kilogram}}{\\mathrm{meter}^{3}}$" ], "text/plain": [ "" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "consts.density_water" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Or for a more symbolic and shorter notation, you can also use:" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "data": { "text/html": [ "1000.0 kilogram/meter3" ], "text/latex": [ "$1000.0\\ \\frac{\\mathrm{kilogram}}{\\mathrm{meter}^{3}}$" ], "text/plain": [ "" ] }, "execution_count": 28, "metadata": {}, "output_type": "execute_result" } ], "source": [ "consts.rho_l" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Exercise #1" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 4. Advanced NumPy Indexing\n", "### Boolean indexing\n", "Numpy can easily create arrays of boolean values and use those to select certain values to extract from an array" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [], "source": [ "# Create some synthetic data representing temperature and wind speed data\n", "np.random.seed(19990503) # Make sure we all have the same data\n", "temp = (20 * np.cos(np.linspace(0, 2 * np.pi, 100)) +\n", " 50 + 2 * np.random.randn(100)) * units.degC\n", "spd = (np.abs(10 * np.sin(np.linspace(0, 2 * np.pi, 100)) +\n", " 10 + 5 * np.random.randn(100))) * units('m/s')" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [ { "data": { "image/png": "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\nVysQgN4RAAAAAElFTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "%matplotlib inline\n", "import matplotlib.pyplot as plt\n", "plt.plot(temp.m, 'tab:red')\n", "plt.plot(spd.m, 'tab:blue');" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "By doing a comparision between a NumPy array and a value, we get an\n", "array of values representing the results of the comparison between\n", "each element and the value" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([ True, True, True, True, True, True, True, True, True,\n", " True, True, True, True, True, True, True, True, True,\n", " True, True, True, True, True, True, True, True, True,\n", " True, False, False, True, False, False, False, False, False,\n", " False, False, False, False, False, False, False, False, False,\n", " False, False, False, False, False, False, False, False, False,\n", " False, False, False, False, False, False, False, False, False,\n", " False, False, True, False, False, False, False, True, True,\n", " True, True, True, True, True, True, True, True, True,\n", " True, True, True, True, True, True, True, True, True,\n", " True, True, True, True, True, True, True, True, True, True], dtype=bool)" ] }, "execution_count": 31, "metadata": {}, "output_type": "execute_result" } ], "source": [ "temp > 45 * units.degC" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can take the resulting array and use this to index into the\n", "NumPy array and retrieve the values where the result was true" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ 69.89825854 71.52313905 69.90028363 66.73828667 66.77980233 72.91468564 69.34603239 69.09533591 68.27350814 64.33916721 67.49497791 67.05282372 63.51829518 63.54034678 65.46576463 62.99683836 59.27662304 61.29361272 60.51641586 57.46048995 55.19793004 53.07572989 54.47998158 53.09552107 54.59037269 47.84272747 49.1435589 45.87151534 45.11976794 45.009292 46.36021141 46.87557425 47.25668992 50.09599544 53.77789358 50.24073197 54.07629059 51.95065202 55.84827794 57.56967086 57.19572063 61.67658285 56.51474577 59.72166924 62.99403256 63.57569453 64.05984232 60.88258643 65.37759899 63.94115754 65.53070256 67.15175649 66.26468701 67.03811793 69.17773618 69.83571708 70.99586742 66.34971928 67.49905207 69.83593609] degC\n" ] } ], "source": [ "print(temp[temp > 45 * units.degC])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "So long as the size of the boolean array matches the data, the boolean array can come from anywhere" ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ 66.73828667 66.77980233 69.34603239 69.09533591 68.27350814 64.33916721 67.49497791 67.05282372 63.51829518 63.54034678 65.46576463 62.99683836 59.27662304 61.29361272 60.51641586 57.46048995 55.19793004 53.07572989 54.47998158 53.09552107 54.59037269 47.84272747 49.1435589 45.87151534 43.95971516 42.72814762 42.45316175 39.2797517 40.23351938 36.77179678 34.43329229 31.42277612 38.97505745 34.10549575 35.70826448 29.01276068 30.31180935 29.31602671 32.84580454 30.76695309 29.11344716 30.16652571 29.91513049 39.51784389 69.17773618 69.83571708 69.83593609] degC\n" ] } ], "source": [ "print(temp[spd > 10 * units('m/s')])" ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 34, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Make a copy so we don't modify the original data\n", "temp2 = temp.copy()\n", "\n", "# Replace all places where spd is <10 with NaN (not a number) so matplotlib skips it\n", "temp2[spd < 10 * units('m/s')] = np.nan * units.degC\n", "plt.plot(temp2, 'tab:red')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Can also combine multiple boolean arrays using the syntax for bitwise operations. **MUST HAVE PARENTHESES** due to operator precedence." ] }, { "cell_type": "code", "execution_count": 35, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ 43.95971516 42.72814762 42.45316175 39.2797517 40.23351938 36.77179678 34.43329229 31.42277612 38.97505745 34.10549575 35.70826448 29.01276068 30.31180935 29.31602671 32.84580454 30.76695309 29.11344716 30.16652571 29.91513049 39.51784389] degC\n" ] } ], "source": [ "print(temp[(temp < 45 * units.degC) & (spd > 10 * units('m/s'))])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Arrays of indices\n", "\n", "You can also use a list or array of indices to extract particular values--this is a natural extension of the regular indexing. For instance, just as we can select the first element:" ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "69.89825854468695 degC\n" ] } ], "source": [ "print(temp[0])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can also extract the first, fifth, and tenth elements:" ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ 69.89825854 66.77980233 64.33916721] degC\n" ] } ], "source": [ "print(temp[[0, 4, 9]])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "One of the ways this comes into play is trying to sort numpy arrays using `argsort`. This function returns the indices of the array that give the items in sorted order. So for our temp \"data\":" ] }, { "cell_type": "code", "execution_count": 38, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[52 57 42 48 54 44 56 51 49 43 50 46 58 55 53 40 37 61 47 45 59 39 36 60 41\n", " 34 66 63 35 38 32 62 64 33 31 67 29 28 68 69 65 30 27 70 71 72 25 26 73 75\n", " 77 21 23 74 76 22 24 20 78 82 80 19 79 16 83 18 87 17 81 84 15 12 13 85 89\n", " 86 9 88 14 90 92 97 3 4 93 11 91 10 98 8 7 94 6 95 99 0 2 96 1 5]\n" ] } ], "source": [ "inds = np.argsort(temp)\n", "print(inds)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can use this array of indices to pass into temp to get it in sorted order:" ] }, { "cell_type": "code", "execution_count": 39, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ 28.71828204 28.85269149 29.01276068 29.11344716 29.25186164 29.31602671 29.42796381 29.91513049 30.16652571 30.31180935 30.48608715 30.76695309 30.93380275 30.95814392 31.07199963 31.1341411 31.42277612 32.27369636 32.44927684 32.84580454 33.37573713 34.10549575 34.43329229 34.95696914 35.70826448 36.77179678 37.06954335 37.39853293 37.7453367 38.97505745 39.2797517 39.34620461 39.51784389 40.23351938 42.45316175 42.69583703 42.72814762 43.95971516 44.03576453 44.45775806 45.009292 45.11976794 45.87151534 46.36021141 46.87557425 47.25668992 47.84272747 49.1435589 50.09599544 50.24073197 51.95065202 53.07572989 53.09552107 53.77789358 54.07629059 54.47998158 54.59037269 55.19793004 55.84827794 56.51474577 57.19572063 57.46048995 57.56967086 59.27662304 59.72166924 60.51641586 60.88258643 61.29361272 61.67658285 62.99403256 62.99683836 63.51829518 63.54034678 63.57569453 63.94115754 64.05984232 64.33916721 65.37759899 65.46576463 65.53070256 66.26468701 66.34971928 66.73828667 66.77980233 67.03811793 67.05282372 67.15175649 67.49497791 67.49905207 68.27350814 69.09533591 69.17773618 69.34603239 69.83571708 69.83593609 69.89825854 69.90028363 70.99586742 71.52313905 72.91468564] degC\n" ] } ], "source": [ "print(temp[inds])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Or we can slice `inds` to only give the 10 highest temperatures:" ] }, { "cell_type": "code", "execution_count": 40, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ 69.09533591 69.17773618 69.34603239 69.83571708 69.83593609 69.89825854 69.90028363 70.99586742 71.52313905 72.91468564] degC\n" ] } ], "source": [ "ten_highest = inds[-10:]\n", "print(temp[ten_highest])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "There are other numpy arg functions that return indices for operating:" ] }, { "cell_type": "code", "execution_count": 41, "metadata": {}, "outputs": [], "source": [ "np.*arg*?" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Exercise #2" ] } ], "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.4" } }, "nbformat": 4, "nbformat_minor": 1 }