{ "metadata": { "name": "", "signature": "sha256:0f3a5c2796d782a51c8677b7a673dffa952797363ae08f995bdd0d11931e4a36" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Introduction to NumPy\n", "\n", "- *Jake VanderPlas*\n", "- *Presented at PyData @ Strata, New York City*\n", "- *October 15, 2014*\n", "\n", "*The source for this notebook can be found at http://github.com/jakevdp/PyData2014 *\n", "\n", "NumPy is a **huge** project, and there's no way to give a complete picture of it in ~40 minutes.\n", "So the goal today is to give a motivation for NumPy and a quick intro to what you'll need to get started.\n", "\n", "Note that this tutorial is written for **Python 3.3 or newer**. In order to be compatible with Python 2.x, we'll do some ``__future__`` imports to start off:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "from __future__ import print_function, division" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 1 }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Outline\n", "\n", "1. Motivating NumPy: it increases both *coding efficiency* and *computational efficiency*\n", "2. Why is NumPy Faster than Python?\n", "3. The core of it all: the ndarray\n", "4. Universal Functions\n", "5. Aggregates" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Motivating NumPy: Efficient Numerical Computing\n", "\n", "We'll start by attempting to motivate *why* you might want to use NumPy for numerical code.\n", "Suppose you'd like to use a plotting tool to graph $y = \\sin(x)$ for $0 \\le x \\le 2\\pi$.\n", "Let's think about how you might do this in Python.\n", "\n", "We'll briefly preview ``matplotlib`` for plotting here; more on this later!" ] }, { "cell_type": "code", "collapsed": false, "input": [ "%matplotlib inline\n", "import matplotlib.pyplot as plt\n", "\n", "# Setup ggplot style, if using matplotlib 1.4 or newer\n", "try:\n", " plt.style.use('ggplot')\n", " print(\"Setting Matplotlib style to ggplot\")\n", "except AttributeError:\n", " print(\"Update matplotlib to enable styles\")" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Setting Matplotlib style to ggplot\n" ] } ], "prompt_number": 2 }, { "cell_type": "markdown", "metadata": {}, "source": [ "### First Try: A C-like Approach\n", "\n", "A new Python user with a background in a low-level language like C or Fortran might approach the problem this way:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "import math\n", "xmin = 0\n", "xmax = 2 * math.pi\n", "N = 1000" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 3 }, { "cell_type": "code", "collapsed": false, "input": [ "# build the arrays\n", "x = []\n", "y = []\n", "for i in range(N):\n", " xval = xmin + i * (xmax - xmin) / N\n", " x.append(xval)\n", " y.append(math.sin(xval))\n", "\n", "# Plot the result with matplotlib\n", "plt.plot(x, y);" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "display_data", "png": "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\nAsz/Aksw1UUGf9+/AAAAAElFTkSuQmCC\n", "text": [ "" ] } ], "prompt_number": 4 }, { "cell_type": "markdown", "metadata": {}, "source": [ "The C/Fortran approach is very prodecural, low-level, and \"hands-on\".\n", "Our program individually creates and modifies every value in each list." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Second Try: A \"Pythonic\" Approach\n", "\n", "A more \"Pythonic\" approach would be to avoid the loops in favor of constructs like list or generator comprehensions. A Python expert without too much numerical background might proceed like this:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "x = [xmin + i * (xmax - xmin) / N for i in range(N)]\n", "y = [math.sin(xi) for xi in x]\n", "\n", "plt.plot(x, y);" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "display_data", "png": "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\nAsz/Aksw1UUGf9+/AAAAAElFTkSuQmCC\n", "text": [ "" ] } ], "prompt_number": 5 }, { "cell_type": "markdown", "metadata": {}, "source": [ "The Pythonic approach is beautiful, in that the lists are created in terse yet easy to grok one-line statements." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Third Try: a NumPy Approach" ] }, { "cell_type": "code", "collapsed": false, "input": [ "import numpy as np\n", "\n", "x = np.linspace(xmin, xmax, N)\n", "y = np.sin(x)\n", "\n", "plt.plot(x, y);" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "display_data", "png": "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\n", "text": [ "" ] } ], "prompt_number": 6 }, { "cell_type": "markdown", "metadata": {}, "source": [ "The NumPy version is perhaps the simplest of all: instead of setting each element of each array \"by hand\", as it were, we instead use simple functions which will create arrays and operate on them element-wise.\n", "\n", "Let's look at all these side-by-side:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "#---------------------------------------------------\n", "# 1. C/Fortran style\n", "x = []\n", "y = []\n", "for i in range(N):\n", " xval = xmin + i * (xmax - xmin) / N\n", " x.append(xval)\n", " y.append(math.sin(xval))\n", "\n", "#---------------------------------------------------\n", "# 2. Pythonic approach\n", "x = [xmin + i * (xmax - xmin) / N for i in range(N)]\n", "y = [math.sin(xi) for xi in x]\n", "\n", "#---------------------------------------------------\n", "# 3. NumPy approach\n", "x = np.linspace(xmin, xmax, N)\n", "y = np.sin(x)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 7 }, { "cell_type": "markdown", "metadata": {}, "source": [ "It's clear that NumPy is the most efficient to type; how does it compare when it comes to computation time? Let's use IPython's ``%%timeit`` cell magic to check. To make things more interesting, let's increase *N* to 100,000:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "N = 100000" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 8 }, { "cell_type": "code", "collapsed": false, "input": [ "%%timeit\n", "# 1. C/Fortran style\n", "x = []\n", "y = []\n", "for i in range(N):\n", " xval = xmin + i * (xmax - xmin) / N\n", " x.append(xval)\n", " y.append(math.sin(xval))" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "10 loops, best of 3: 61.2 ms per loop\n" ] } ], "prompt_number": 9 }, { "cell_type": "code", "collapsed": false, "input": [ "%%timeit\n", "# 2. Pythonic style\n", "x = [xmin + i * (xmax - xmin) / N for i in range(N)]\n", "y = [math.sin(xi) for xi in x]" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "10 loops, best of 3: 45.3 ms per loop\n" ] } ], "prompt_number": 10 }, { "cell_type": "code", "collapsed": false, "input": [ "%%timeit\n", "# 3. NumPy approach\n", "x = np.linspace(xmin, xmax, N)\n", "y = np.sin(x)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "1000 loops, best of 3: 1.74 ms per loop\n" ] } ], "prompt_number": 11 }, { "cell_type": "markdown", "metadata": {}, "source": [ "We see that for this operation, NumPy is **30-40x faster** than either of the pure Python approaches!\n", "\n", "What we've seen above, in a nutshell, is why NumPy is useful for numerical computing:\n", "\n", "1. Numerical operations across arrays are **faster and more natural to type.**\n", "2. Numerical operations across arrays are **more clear to read.**\n", "3. Numerical operations across arrays are **more computationally efficient.**" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## So Why is NumPy So Much Faster?\n", "\n", "The reasons that these operations are so much faster in NumPy than in Python boils down to the fact that **Python is not a compiled language**, while NumPy pushes certain operations down into compiled code. We'll talk about three main components of this below:" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 1. Python is Dynamically rather than Statically Typed\n", "\n", "Python is a dynamically-typed language, where just about anything goes.\n", "This means you can do things that would seem downright silly in C or Fortran, like replace an integer in an array with a string:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "L = list(range(5))\n", "L" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 12, "text": [ "[0, 1, 2, 3, 4]" ] } ], "prompt_number": 12 }, { "cell_type": "code", "collapsed": false, "input": [ "L[3] = \"three\"\n", "L" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 13, "text": [ "[0, 1, 2, 'three', 4]" ] } ], "prompt_number": 13 }, { "cell_type": "markdown", "metadata": {}, "source": [ "The reason that Python can be so flexible is that, fundamentally **all objects are of the same type**: they are ``PyObject`` instances. Each ``PyObject`` does have an indicator of what type it is, but this information is *accessed at run-time*, rather than at some compile phase.\n", "\n", "Functionally, the difference between a C integer and a Python integer looks like this:\n", "\n", "\n", "\n", "That ``PyObject_HEAD`` block is what contains all of Python's dynamic goodies, like the type, reference count, etc.\n", "\n", "*Yes, there are modern JIT-compiled languages which bridge this gap, but Python doesn't yet do this, and the projects that do (PyPy, Pyston, etc.) aren't yet mature enough to use for numerical computing in practice.*" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 2. Python is Interpreted rather than Compiled\n", "\n", "This dynamic type-checking means that Python's code cannot be pre-compiled, as with C/Fortran/etc.\n", "So, for example, when we multiply each of our list elements by two, we get the following:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "[2 * Li for Li in L]" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 14, "text": [ "[0, 2, 4, 'threethree', 8]" ] } ], "prompt_number": 14 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Notice that the ``*`` operator does fundamentally different things with integer vs. string objects!\n", "Here the ``*`` cannot be mapped onto some machine-code function until the program is actually run: this leads to type-checking overhead each time the function is called, even if you have an array of all integers! There's no way for Python to know ahead of time that the same ``*`` needs to be used each time: this is the sense in which it's interpreted rather than compiled.\n", "\n", "*Yes, Python is compiled to a sort of bytecode (i.e. ``.pyc`` files), but no deep optimization takes place: this bytecode is basically a 1-to-1 mapping to the Python code that generates it.*" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 3. Python's flexible object model can lead to inefficiencies\n", "\n", "When it comes to creating lists or arrays of objects, the fact that Python is dynamically typed can make a **huge** difference: consider the memory layout of a NumPy array vs that of a Python list.\n", "Consider the following two objects:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "L = list(range(1, 9))\n", "L" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 15, "text": [ "[1, 2, 3, 4, 5, 6, 7, 8]" ] } ], "prompt_number": 15 }, { "cell_type": "code", "collapsed": false, "input": [ "A = np.arange(1, 9)\n", "A" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 16, "text": [ "array([1, 2, 3, 4, 5, 6, 7, 8])" ] } ], "prompt_number": 16 }, { "cell_type": "markdown", "metadata": {}, "source": [ "They may look superfically similar, but under the hood they are anything but. Here's a schematic of their memory configuration under-the-hood:\n", "\n", "\n", "\n", "NumPy arrays are simply pointers to buffers containing data of a uniform type; Python lists are *pointers to pointers*, each of which in turn points to a ``PyObject`` instance existing in memory.\n", "\n", "*Yes, Python has built-in ``array`` objects that provide mono-typed storage buffers, but they are nowhere near as useful as NumPy's arrays.*" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Exploring NumPy's ``ndarray`` object\n", "\n", "NumPy's ``ndarray`` object is essentially a pointer to a data buffer, with metadata telling us how to interpret it.\n", "\n", "
\n", "\n", "
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "For example, we can create the following one-dimensional array:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "x = np.arange(10)\n", "x" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 17, "text": [ "array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])" ] } ], "prompt_number": 17 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's look at some of the important attributes of this object:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "# data type\n", "x.dtype" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 18, "text": [ "dtype('int64')" ] } ], "prompt_number": 18 }, { "cell_type": "code", "collapsed": false, "input": [ "# array shape\n", "x.shape" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 19, "text": [ "(10,)" ] } ], "prompt_number": 19 }, { "cell_type": "code", "collapsed": false, "input": [ "# number of dimensions\n", "x.ndim" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 20, "text": [ "1" ] } ], "prompt_number": 20 }, { "cell_type": "code", "collapsed": false, "input": [ "# size of the array\n", "x.size" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 21, "text": [ "10" ] } ], "prompt_number": 21 }, { "cell_type": "code", "collapsed": false, "input": [ "# number of bytes to step for each dimension\n", "x.strides" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 22, "text": [ "(8,)" ] } ], "prompt_number": 22 }, { "cell_type": "code", "collapsed": false, "input": [ "# flags specifying array properties\n", "x.flags" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 23, "text": [ " C_CONTIGUOUS : True\n", " F_CONTIGUOUS : True\n", " OWNDATA : True\n", " WRITEABLE : True\n", " ALIGNED : True\n", " UPDATEIFCOPY : False" ] } ], "prompt_number": 23 }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Arrays as Views" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's focus on this ``OWNDATA`` property of the ``x`` array above.\n", "Here we see that the array ``x`` owns its data, but if we create some derived array from ``x``, this will change.\n", "Let's use Python's standard slicing syntax to create a new array containing every other item in ``x``:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "y = x[::2]\n", "y" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 24, "text": [ "array([0, 2, 4, 6, 8])" ] } ], "prompt_number": 24 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Checking ``y``'s flags, we see now that ``OWNDATA`` is False:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "y.flags" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 25, "text": [ " C_CONTIGUOUS : False\n", " F_CONTIGUOUS : False\n", " OWNDATA : False\n", " WRITEABLE : True\n", " ALIGNED : True\n", " UPDATEIFCOPY : False" ] } ], "prompt_number": 25 }, { "cell_type": "markdown", "metadata": {}, "source": [ "``x`` still owns the data; ``y`` simply has a pointer to it!\n", "Let's demonstrate this by changing one of the values in ``y``, and observing that the corresponding ``x`` value changes as well:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "y[2] = 100\n", "x" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 26, "text": [ "array([ 0, 1, 2, 3, 100, 5, 6, 7, 8, 9])" ] } ], "prompt_number": 26 }, { "cell_type": "markdown", "metadata": {}, "source": [ "So how does this work?\n", "It turns out that ``x`` and ``y`` point to the *same memory buffer*, but view it in different ways:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "import ctypes\n", "print(x.data, x.itemsize, x.strides)\n", "print(y.data, y.itemsize, y.strides)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ " 8 (8,)\n", " 8 (16,)\n" ] } ], "prompt_number": 27 }, { "cell_type": "markdown", "metadata": {}, "source": [ "The ``strides`` attribute shows you the number of bytes for each step in the array; ``y`` essentially takes two 8-byte steps each time it accesses the next array element." ] }, { "cell_type": "code", "collapsed": false, "input": [ "print(x)\n", "print(y)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "[ 0 1 2 3 100 5 6 7 8 9]\n", "[ 0 2 100 6 8]\n" ] } ], "prompt_number": 28 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Thus we see that when constructing arrays, we generally will end up with **views** rather than **copies** of source arrays. This is one extremely powerful aspect of NumPy, but also something you should certainly be aware of!" ] }, { "cell_type": "code", "collapsed": false, "input": [ "# Side note: if you actually want a copy, you can do, e.g.\n", "y = x[::2].copy()" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 29 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Such views can be even more powerful: for example, we can reshape ``x`` into a two-dimensional array:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "x2 = x.reshape(2, 5)\n", "x2" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 30, "text": [ "array([[ 0, 1, 2, 3, 100],\n", " [ 5, 6, 7, 8, 9]])" ] } ], "prompt_number": 30 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Again, this is simply a view of ``x``:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "x2[1, 4] = 42\n", "x2" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 31, "text": [ "array([[ 0, 1, 2, 3, 100],\n", " [ 5, 6, 7, 8, 42]])" ] } ], "prompt_number": 31 }, { "cell_type": "code", "collapsed": false, "input": [ "x" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 32, "text": [ "array([ 0, 1, 2, 3, 100, 5, 6, 7, 8, 42])" ] } ], "prompt_number": 32 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's see some of the attributes of ``x2``:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "# number of dimensions\n", "x2.ndim" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 33, "text": [ "2" ] } ], "prompt_number": 33 }, { "cell_type": "code", "collapsed": false, "input": [ "# shape of the array\n", "x2.shape" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 34, "text": [ "(2, 5)" ] } ], "prompt_number": 34 }, { "cell_type": "code", "collapsed": false, "input": [ "# size of the array\n", "x2.size" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 35, "text": [ "10" ] } ], "prompt_number": 35 }, { "cell_type": "code", "collapsed": false, "input": [ "# number of bytes to step for each dimension\n", "x2.strides" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 36, "text": [ "(40, 8)" ] } ], "prompt_number": 36 }, { "cell_type": "code", "collapsed": false, "input": [ "x2.flags" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 37, "text": [ " C_CONTIGUOUS : True\n", " F_CONTIGUOUS : False\n", " OWNDATA : False\n", " WRITEABLE : True\n", " ALIGNED : True\n", " UPDATEIFCOPY : False" ] } ], "prompt_number": 37 }, { "cell_type": "markdown", "metadata": {}, "source": [ "So as you use NumPy arrays, keep this in mind! What you are using is a *Python object* which views a *raw data buffer* as a flexible array:\n", "\n", "
\n", "\n", "
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Creating NumPy Arrays\n", "\n", "Here we'll demonstrate some functions to create NumPy arrays from scratch:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "# Array of zeros\n", "np.zeros((2, 3))" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 38, "text": [ "array([[ 0., 0., 0.],\n", " [ 0., 0., 0.]])" ] } ], "prompt_number": 38 }, { "cell_type": "code", "collapsed": false, "input": [ "# Array of ones\n", "np.ones((3, 4))" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 39, "text": [ "array([[ 1., 1., 1., 1.],\n", " [ 1., 1., 1., 1.],\n", " [ 1., 1., 1., 1.]])" ] } ], "prompt_number": 39 }, { "cell_type": "code", "collapsed": false, "input": [ "# Like Python's range() function\n", "np.arange(10)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 40, "text": [ "array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])" ] } ], "prompt_number": 40 }, { "cell_type": "code", "collapsed": false, "input": [ "# 5 steps from 0 to 1\n", "np.linspace(0, 1, 5)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 41, "text": [ "array([ 0. , 0.25, 0.5 , 0.75, 1. ])" ] } ], "prompt_number": 41 }, { "cell_type": "code", "collapsed": false, "input": [ "# uninitialized array\n", "np.empty(10)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 42, "text": [ "array([ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])" ] } ], "prompt_number": 42 }, { "cell_type": "code", "collapsed": false, "input": [ "# random numbers between 0 and 1\n", "np.random.rand(5)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 43, "text": [ "array([ 0.48200098, 0.91255848, 0.43654199, 0.86788548, 0.36746416])" ] } ], "prompt_number": 43 }, { "cell_type": "code", "collapsed": false, "input": [ "# standard-norm-distributed random numbers\n", "np.random.randn(5)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 44, "text": [ "array([-0.86029106, 0.27795606, -1.59104791, -0.30107627, 0.46938077])" ] } ], "prompt_number": 44 }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Some Strategies for Fast Computing with NumPy\n", "\n", "Here we'll discuss a couple strategies for fast computing with NumPy.\n", "In particular, we'll mention **universal functions**, which operate elementwise on arrays, and **aggregate functions**, which collapse arrays along particular dimensions." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Universal Functions\n", "\n", "Where the rubber hits the road with NumPy is with Universal functions: these are functions which operate *elementwise* on arrays. We saw this above with the ``np.sin`` function, which takes an array and returns an array with the elementwise sine:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "x = np.linspace(0, 2 * np.pi)\n", "y = np.sin(x)\n", "print(x.shape)\n", "print(y.shape)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "(50,)\n", "(50,)\n" ] } ], "prompt_number": 45 }, { "cell_type": "code", "collapsed": false, "input": [ "plt.plot(x, y);" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "display_data", "png": "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\nwU9EFGT+Pxvu78Bmq8eQAAAAAElFTkSuQmCC\n", "text": [ "" ] } ], "prompt_number": 46 }, { "cell_type": "markdown", "metadata": {}, "source": [ "NumPy also implements many arithmetic functions (e.g. ``+``, ``-``, ``*``, ``/``, ``**``) as element-wise ufuncs. So we can do things like this:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "plt.plot(x, y)\n", "plt.plot(x, y + 1)\n", "plt.plot(x, -2 * y)\n", "plt.plot(x, 1 / (1 + y ** 2));" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "display_data", "png": "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\n", "text": [ "" ] } ], "prompt_number": 47 }, { "cell_type": "markdown", "metadata": {}, "source": [ "You can find a lot of interesting ufuncs in NumPy: for example" ] }, { "cell_type": "code", "collapsed": false, "input": [ "for f in [np.sin, np.cos, np.exp, np.log, np.sinc]:\n", " plt.plot(x, f(x), label='np.' + f.__name__)\n", "plt.legend()\n", "plt.ylim(-1, 5)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stderr", "text": [ "-c:2: RuntimeWarning: divide by zero encountered in log\n" ] }, { "metadata": {}, "output_type": "pyout", "prompt_number": 48, "text": [ "(-1, 5)" ] }, { "metadata": {}, "output_type": "display_data", "png": "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\n", "text": [ "" ] } ], "prompt_number": 48 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Other interesting functions can be found in ``scipy.special``. For example, here are some Bessell functions:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "from scipy import special\n", "x = np.linspace(0, 30, 500)\n", "plt.plot(x, special.j0(x), label='j0')\n", "plt.plot(x, special.j1(x), label='j1')\n", "plt.plot(x, special.jn(3, x), label='j3')\n", "plt.legend();" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "display_data", "png": "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\n6MH+P1QJ9EYJTBG4AAAAAElFTkSuQmCC\n", "text": [ "" ] } ], "prompt_number": 67 }, { "cell_type": "markdown", "metadata": {}, "source": [ "There are **far, far** more options available, and if you want some sort of specialized mathematical function, you can probably find a ufunc version of it in ``scipy.special``.\n", "Perhaps the best way to explore this is to use IPython's help or tab-completion features:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "from scipy import special\n", "special?" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 68 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Notice the key here **UFuncs loop over data for you, so you don't have to write these loops by hand in Python**." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Aggregate Functions\n", "\n", "Aggregate function are those which collapse an array along a particular dimension.\n", "For example, the minimum of an array can be found using NumPy's ``min()`` aggregate:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "x = np.random.random(100)\n", "x.min()" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 50, "text": [ "0.0040929643153089224" ] } ], "prompt_number": 50 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Other aggregates exist as well:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "# Maximum value\n", "x.max()" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 51, "text": [ "0.96697914536521146" ] } ], "prompt_number": 51 }, { "cell_type": "code", "collapsed": false, "input": [ "# Sum\n", "x.sum()" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 52, "text": [ "49.430117531542443" ] } ], "prompt_number": 52 }, { "cell_type": "code", "collapsed": false, "input": [ "# Mean\n", "x.mean()" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 53, "text": [ "0.49430117531542445" ] } ], "prompt_number": 53 }, { "cell_type": "code", "collapsed": false, "input": [ "# Product\n", "x.prod()" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 54, "text": [ "4.6730597420222299e-46" ] } ], "prompt_number": 54 }, { "cell_type": "code", "collapsed": false, "input": [ "# Standard Deviation\n", "x.std()" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 55, "text": [ "0.28299025459860538" ] } ], "prompt_number": 55 }, { "cell_type": "code", "collapsed": false, "input": [ "# Variance\n", "x.var()" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 56, "text": [ "0.080083484197783508" ] } ], "prompt_number": 56 }, { "cell_type": "code", "collapsed": false, "input": [ "# Median\n", "np.median(x)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 57, "text": [ "0.51601049164335466" ] } ], "prompt_number": 57 }, { "cell_type": "code", "collapsed": false, "input": [ "# Quantiles\n", "np.percentile(x, [25, 50, 75])" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 58, "text": [ "array([ 0.25034498, 0.51601049, 0.71508313])" ] } ], "prompt_number": 58 }, { "cell_type": "markdown", "metadata": {}, "source": [ "For multi-dimensional arrays, we can compute aggregates along certain specified dimensions:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "y = np.arange(12).reshape(3, 4)\n", "y" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 59, "text": [ "array([[ 0, 1, 2, 3],\n", " [ 4, 5, 6, 7],\n", " [ 8, 9, 10, 11]])" ] } ], "prompt_number": 59 }, { "cell_type": "code", "collapsed": false, "input": [ "# sum of each column\n", "y.sum(0)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 60, "text": [ "array([12, 15, 18, 21])" ] } ], "prompt_number": 60 }, { "cell_type": "code", "collapsed": false, "input": [ "# sum of each row\n", "y.sum(1)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 61, "text": [ "array([ 6, 22, 38])" ] } ], "prompt_number": 61 }, { "cell_type": "code", "collapsed": false, "input": [ "# Keep the dimensions (NumPy 1.7 or later)\n", "y.sum(1, keepdims=True)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 62, "text": [ "array([[ 6],\n", " [22],\n", " [38]])" ] } ], "prompt_number": 62 }, { "cell_type": "code", "collapsed": false, "input": [ "np.std(y, 0)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 63, "text": [ "array([ 3.26598632, 3.26598632, 3.26598632, 3.26598632])" ] } ], "prompt_number": 63 }, { "cell_type": "markdown", "metadata": {}, "source": [ "As with ufuncs, the key is this: **Aggregates loop over data for you, so you don't have to write the loops yourself in Python.**" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Last Thoughts; Where to Learn More\n", "\n", "We've just scratched the surface here: there is much more to using NumPy effectively and efficiently. We haven't covered topics like advanced indexing & slicing, masked arrays, structured arrays, linear algebra, fourier transforms, and the many more utilities that are available.\n", "\n", "If there's one thing to take away from this brief introduction, it's this:\n", "\n", " If you write Python loops which scan over your data, you're (most likely) doing it wrong. \n", "
\n", "\n", "NumPy provides routines to replace *loops* with *vectorized* operations, as we've seen above, and this is where it gains its efficiency.\n", "\n", "For a more in-depth presentiation on the subject of efficient computing with NumPy, you can see [this 1.5 hour tutorial](http://vimeo.com/79820956) I gave at PyData 2013 (view the notebook [here](http://nbviewer.ipython.org/github/jakevdp/2014_fall_ASTR599/blob/master/notebooks/11_EfficientNumpy.ipynb))." ] } ], "metadata": {} } ] }