User Guide Release 1.18.4
Total Page:16
File Type:pdf, Size:1020Kb
NumPy User Guide Release 1.18.4 Written by the NumPy community May 24, 2020 CONTENTS 1 Setting up 3 2 Quickstart tutorial 9 3 NumPy basics 33 4 Miscellaneous 97 5 NumPy for Matlab users 103 6 Building from source 111 7 Using NumPy C-API 115 Python Module Index 163 Index 165 i ii NumPy User Guide, Release 1.18.4 This guide is intended as an introductory overview of NumPy and explains how to install and make use of the most important features of NumPy. For detailed reference documentation of the functions and classes contained in the package, see the reference. CONTENTS 1 NumPy User Guide, Release 1.18.4 2 CONTENTS CHAPTER ONE SETTING UP 1.1 What is NumPy? NumPy is the fundamental package for scientific computing in Python. It is a Python library that provides a multidi- mensional array object, various derived objects (such as masked arrays and matrices), and an assortment of routines for fast operations on arrays, including mathematical, logical, shape manipulation, sorting, selecting, I/O, discrete Fourier transforms, basic linear algebra, basic statistical operations, random simulation and much more. At the core of the NumPy package, is the ndarray object. This encapsulates n-dimensional arrays of homogeneous data types, with many operations being performed in compiled code for performance. There are several important differences between NumPy arrays and the standard Python sequences: • NumPy arrays have a fixed size at creation, unlike Python lists (which can grow dynamically). Changing the size of an ndarray will create a new array and delete the original. • The elements in a NumPy array are all required to be of the same data type, and thus will be the same size in memory. The exception: one can have arrays of (Python, including NumPy) objects, thereby allowing for arrays of different sized elements. • NumPy arrays facilitate advanced mathematical and other types of operations on large numbers of data. Typi- cally, such operations are executed more efficiently and with less code than is possible using Python’s built-in sequences. • A growing plethora of scientific and mathematical Python-based packages are using NumPy arrays; though these typically support Python-sequence input, they convert such input to NumPy arrays prior to processing, and they often output NumPy arrays. In other words, in order to efficiently use much (perhaps even most) of today’s scientific/mathematical Python-based software, just knowing how to use Python’s built-in sequence types is insufficient - one also needs to know how to use NumPy arrays. The points about sequence size and speed are particularly important in scientific computing. As a simple example, consider the case of multiplying each element in a 1-D sequence with the corresponding element in another sequence of the same length. If the data are stored in two Python lists, a and b, we could iterate over each element: c=[] for i in range(len(a)): c.append(a[i]*b[i]) This produces the correct answer, but if a and b each contain millions of numbers, we will pay the price for the inefficiencies of looping in Python. We could accomplish the same task much more quickly in C by writing (for clarity we neglect variable declarations and initializations, memory allocation, etc.) for (i=0; i< rows; i++): { c[i]= a[i] *b[i]; } 3 NumPy User Guide, Release 1.18.4 This saves all the overhead involved in interpreting the Python code and manipulating Python objects, but at the expense of the benefits gained from coding in Python. Furthermore, the coding work required increases with the dimensionality of our data. In the case of a 2-D array, for example, the C code (abridged as before) expands to for (i=0; i< rows; i++): { for (j=0; j< columns; j++): { c[i][j]= a[i][j] *b[i][j]; } } NumPy gives us the best of both worlds: element-by-element operations are the “default mode” when an ndarray is involved, but the element-by-element operation is speedily executed by pre-compiled C code. In NumPy c=a * b does what the earlier examples do, at near-C speeds, but with the code simplicity we expect from something based on Python. Indeed, the NumPy idiom is even simpler! This last example illustrates two of NumPy’s features which are the basis of much of its power: vectorization and broadcasting. 1.1.1 Why is NumPy Fast? Vectorization describes the absence of any explicit looping, indexing, etc., in the code - these things are taking place, of course, just “behind the scenes” in optimized, pre-compiled C code. Vectorized code has many advantages, among which are: • vectorized code is more concise and easier to read • fewer lines of code generally means fewer bugs • the code more closely resembles standard mathematical notation (making it easier, typically, to correctly code mathematical constructs) • vectorization results in more “Pythonic” code. Without vectorization, our code would be littered with inefficient and difficult to read for loops. Broadcasting is the term used to describe the implicit element-by-element behavior of operations; generally speaking, in NumPy all operations, not just arithmetic operations, but logical, bit-wise, functional, etc., behave in this implicit element-by-element fashion, i.e., they broadcast. Moreover, in the example above, a and b could be multidimensional arrays of the same shape, or a scalar and an array, or even two arrays of with different shapes, provided that the smaller array is “expandable” to the shape of the larger in such a way that the resulting broadcast is unambiguous. For detailed “rules” of broadcasting see numpy.doc.broadcasting. 1.1.2 Who Else Uses NumPy? NumPy fully supports an object-oriented approach, starting, once again, with ndarray. For example, ndarray is a class, possessing numerous methods and attributes. Many of its methods are mirrored by functions in the outer- most NumPy namespace, allowing the programmer to code in whichever paradigm they prefer. This flexibility has allowed the NumPy array dialect and NumPy ndarray class to become the de-facto language of multi-dimensional data interchange used in Python. 4 Chapter 1. Setting up NumPy User Guide, Release 1.18.4 1.2 Installing NumPy In most use cases the best way to install NumPy on your system is by using a pre-built package for your operating system. Please see https://scipy.org/install.html for links to available options. For instructions on building for source package, see Building from source. This information is useful mainly for advanced users. 1.3 Troubleshooting ImportError Note: Since this information may be updated regularly, please ensure you are viewing the most up-to-date version. 1.3.1 ImportError In certain cases a failed installation or setup issue can cause you to see the following error message: IMPORTANT: PLEASE READ THIS FOR ADVICE ON HOW TO SOLVE THIS ISSUE! Importing the numpy c-extensions failed. This error can happen for different reasons, often due to issues with your setup. The error also has additional information to help you troubleshoot: • Your Python version • Your NumPy version Please check both of these carefully to see if they are what you expect. You may need to check your PATH or PYTHONPATH environment variables (see Check Environment Variables below). The following sections list commonly reported issues depending on your setup. If you have an issue/solution that you think should appear please open a NumPy issue so that it will be added. There are a few commonly reported issues depending on your system/setup. If none of the following tips help you, please be sure to note the following: • how you installed Python • how you installed NumPy • your operating system • whether or not you have multiple versions of Python installed • if you built from source, your compiler versions and ideally a build log when investigating further and asking for support. 1.2. Installing NumPy 5 NumPy User Guide, Release 1.18.4 Using Python from conda (Anaconda) Please make sure that you have activated your conda environment. See also the conda user-guide. Using Anaconda/conda Python within PyCharm There are fairly common issues when using PyCharm together with Anaconda, please see the PyCharm support Raspberry Pi There are sometimes issues reported on Raspberry Pi setups when installing using pip3 install (or pip install). These will typically mention: libf77blas.so.3: cannot open shared object file: No such file or directory The solution will be to either: sudo apt-get install libatlas-base-dev to install the missing libraries expected by the self-compiled NumPy (ATLAS is a possible provider of linear algebra). Alternatively use the NumPy provided by Raspbian. In which case run: pip3 uninstall numpy # remove previously installed version apt install python3-numpy Debug build on Windows Rather than building your project in DEBUG mode on windows, try building in RELEASE mode with debug symbols and no optimization. Full DEBUG mode on windows changes the names of the DLLs python expects to find, so if you wish to truly work in DEBUG mode you will need to recompile the entire stack of python modules you work with including NumPy All Setups Occasionally there may be simple issues with old or bad installations of NumPy. In this case you may just try to uninstall and reinstall NumPy. Make sure that NumPy is not found after uninstalling. Development Setup If you are using a development setup, make sure to run git clean -xdf to delete all files not under version control (be careful not to lose any modifications you made, e.g. site.cfg). In many cases files from old builds may lead to incorrect builds.