# NumPy

## Contents

## Background

NumPy

The fundamental package needed for scientific computing with Python is called NumPy. This package contains:

- a powerful N-dimensional array object
- sophisticated (broadcasting) functions
- basic linear algebra functions
- basic Fourier transforms
- sophisticated random number capabilities
- tools for integrating Fortran code.
- tools for integrating C/C++ code.

Besides its obvious scientific uses, NumPy can also be used as an efficient multi-dimensional container of generic data. Arbitrary data-types can be defined. This allows NumPy to seamlessly and speedily integrate with a wide-variety of databases. NumPy derives from the old Numeric code base and can be used as a replacement for Numeric. It also adds the features introduced by Numarray and can also be used to replace Numarray.

Numeric users should find the transition relatively easy (although not without some effort). There is a module (numpy.oldnumeric.alter_code1) that can make most of the necessary changes to your Python code that used Numeric to work with NumPy's Numeric compatibility module.

Users of numarray can also transition their code using a similar module (numpy.numarray.alter_code1) and the numpy.numarray compatibility layer.

C-code written to either package can be easily ported to NumPy using "numpy/oldnumeric.h" and "numpy/libnumarray.h" for the Numeric C-API and the Numarray C-API respectively. Sourceforge download site.

## Documentation

There is a book available "Guide to NumPy" which details NumPy.

Much of the documentation for Numeric and Numarray is applicable to the new NumPy package. However, there are significant feature improvements. A complete guide to the new system has been written by the primary developer, Travis Oliphant. It is now in the public domain.

Other Documentation is available at the scipy website and in the docstrings (which can be extracted using pydoc). Free Documentation for Numeric (most of which is still valid) is here or as a pdf file. Obviously you should replace references to Numeric in that document with numpy (i.e. instead of import Numeric, use import numpy).

For about 6 months at the end of 2005, the new package was called SciPy Core (not to be confused with the full SciPy package which remains a separate package), and so you will occasionally see references to SciPy Core floating around. It was decided in January 2006 to go with the historical name of NumPy for the new package. Realize that NumPy (module name numpy) is the new name. Because of the name-change, there were a lot of dicussions that took place on scipy-dev@scipy.org and scipy-user@scipy.org. If you have a question about the new system, you may wish to run a search on those mailing lists as well as the main NumPy list (numpy-discussion@lists.sourceforge.net)

## The Array Interface

Out of developer discussions between developers of Numarray, Numeric, and NumPy has arisen the concept of an array interface. It is the opinion of many involved that a default N-dimensional array interface (even leading to a very simple N-dimensional array object and an N-dimensional array protocol) is what should be pushed for placement in the Python core. It is doubtful that the community will want to slow down development of NumPy anytime soon by placing it the Python core. But the array interface should become a part of Python as soon as possible. Anybody wanting to push this forward is welcome to help.

The description of the array interface is here.

## Interfacing to Compiled Code

There are several ways to use NumPy to interface with compiled code including f2py, swig, ctypes, pyrex (cython), as well as the NumPy C-API.

- f2py uses interface files which can be auto-generated and tweaked by hand to produce nice-looking interfaces to Fortran code.
- swig requires the numpy.i file in order to integrate with numpy. More information about the swig interface to numpy is here.
- ctypes is included in Python 2.5 and numpy has a ctypes attribute and a ctypes library which makes it easy to use NumPy array objects as generic chunks of memory for ctypes.
- pyrex is a Python-like language for writing C-extensions. Look at the mtrand code for an example of using NumPy arrays in pyrex extensions.

## Further Information

- Questions? Ask them at the numpy-discussion@scipy.org mailing list.
- NumPy home page