summaryrefslogtreecommitdiff
path: root/numpy/doc/numpybook/numpybook.lyx
diff options
context:
space:
mode:
Diffstat (limited to 'numpy/doc/numpybook/numpybook.lyx')
-rw-r--r--numpy/doc/numpybook/numpybook.lyx27836
1 files changed, 27836 insertions, 0 deletions
diff --git a/numpy/doc/numpybook/numpybook.lyx b/numpy/doc/numpybook/numpybook.lyx
new file mode 100644
index 000000000..16ee19d90
--- /dev/null
+++ b/numpy/doc/numpybook/numpybook.lyx
@@ -0,0 +1,27836 @@
+#LyX 1.5.1 created this file. For more info see http://www.lyx.org/
+\lyxformat 276
+\begin_document
+\begin_header
+\textclass mybook
+\begin_preamble
+
+
+
+\usepackage{array}
+
+% This gives us a better font in URL links (otherwise the default
+% MonoSpace font is bitmapped, and it looks horrible in PDF)
+\usepackage{courier}
+
+\usepackage{fullpage}
+
+\usepackage{color} % so we can use red for the fixme warnings
+
+% The hyperref package gives us a pdf with properly built
+% internal navigation ('pdf bookmarks' for the table of contents,
+% internal cross-reference links, web links for URLs, etc.)
+
+% A few colors to replace the defaults for certain link types
+\definecolor{darkorange}{rgb}{.71,0.21,0.01}
+\definecolor{darkgreen}{rgb}{.12,.54,.11}
+
+\usepackage[
+ %pdftex, % needed for pdflatex
+ breaklinks=true, % so long urls are correctly broken across lines
+ colorlinks=true,
+ urlcolor=blue,
+ linkcolor=darkorange,
+ citecolor=darkgreen,
+ ]{hyperref}
+
+% This helps prevent overly long lines that stretch beyond the margins
+\sloppy
+
+% Define a \fixme command to mark visually things needing fixing in the draft.
+% For final printing or to simply disable these bright warnings, simply
+% uncomment the \renewcommand redefinition below
+
+\newcommand{\fixme}[1] {
+\textcolor{red}{
+{\fbox{ {\bf FIX}
+\ensuremath{\blacktriangleright \blacktriangleright \blacktriangleright}}
+{\bf #1}
+\fbox{\ensuremath{ \blacktriangleleft \blacktriangleleft \blacktriangleleft }
+} } }
+}
+% Uncomment the next line to make the \fixme command be a no-op
+%\renewcommand{\fixme}[1]{}
+
+%%% If you also want to use the listings package for nicely formatted
+%%% Python source code, this configuration produces good on-paper and
+%%% on-screen results:
+
+\definecolor{orange}{cmyk}{0,0.4,0.8,0.2}
+% Use and configure listings package for nicely formatted code
+\usepackage{listings}
+\lstset{
+ language=Python,
+ basicstyle=\small\ttfamily,
+ commentstyle=\ttfamily\color{blue},
+ stringstyle=\ttfamily\color{orange},
+ showstringspaces=false,
+ breaklines=true,
+ postbreak = \space\dots
+}
+\end_preamble
+\language english
+\inputencoding auto
+\font_roman default
+\font_sans default
+\font_typewriter default
+\font_default_family default
+\font_sc false
+\font_osf false
+\font_sf_scale 100
+\font_tt_scale 100
+\graphics default
+\paperfontsize 10
+\spacing onehalf
+\papersize custom
+\use_geometry true
+\use_amsmath 2
+\use_esint 0
+\cite_engine basic
+\use_bibtopic false
+\paperorientation portrait
+\paperwidth 7in
+\paperheight 9in
+\leftmargin 1in
+\topmargin 1in
+\rightmargin 1in
+\bottommargin 1in
+\secnumdepth 3
+\tocdepth 3
+\paragraph_separation indent
+\defskip medskip
+\quotes_language english
+\papercolumns 1
+\papersides 1
+\paperpagestyle headings
+\tracking_changes false
+\output_changes false
+\author ""
+\author ""
+\end_header
+
+\begin_body
+
+\begin_layout Standard
+\begin_inset VSpace 2in*
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+\align center
+
+\family sans
+\series bold
+\size giant
+Guide to NumPy
+\end_layout
+
+\begin_layout Standard
+\align center
+
+\family sans
+\size larger
+Travis E.
+ Oliphant, PhD
+\newline
+August 21, 2008
+\end_layout
+
+\begin_layout Standard
+\begin_inset VSpace vfill
+\end_inset
+
+This book was released from a restricted distribution using a Market-Determined,
+ Temporary, Distribution-Restriction (MDTDR) system (see http://www.trelgol.com)
+ on August 21, 2008.
+ It is now released to the public domain and can be used as source material
+ for other works.
+
+\end_layout
+
+\begin_layout Standard
+\begin_inset LatexCommand tableofcontents
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+\begin_inset FloatList table
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Part
+NumPy from Python
+\end_layout
+
+\begin_layout Chapter
+Origins of NumPy
+\end_layout
+
+\begin_layout Quotation
+A complex system that works is invariably found to have evolved from a simple
+ system that worked
+\end_layout
+
+\begin_layout Right Address
+---
+\emph on
+John Gall
+\end_layout
+
+\begin_layout Quotation
+Copy from one, it's plagiarism; copy from two, it's research.
+\end_layout
+
+\begin_layout Right Address
+---
+\emph on
+Wilson Mizner
+\end_layout
+
+\begin_layout Standard
+NumPy builds on (and is a successor to) the successful Numeric array object.
+ Its goal is to create the corner-stone for a useful environment for scientific
+ computing.
+ In order to better understand the people surrounding NumPy and (its library-pac
+kage) SciPy, I will explain a little about how SciPy and (current) NumPy
+ originated.
+ In 1998, as a graduate student studying biomedical imaging at the Mayo
+ Clinic in Rochester, MN, I came across Python and its numerical extension
+ (Numeric) while I was looking for ways to analyze large data sets for Magnetic
+ Resonance Imaging and Ultrasound using a high-level language.
+ I quickly fell in love with Python programming which is a remarkable statement
+ to make about a programming language.
+ If I had not seen others with the same view, I might have seriously doubted
+ my sanity.
+ I became rather involved in the Numeric Python community, adding the C-API
+ chapter to the Numeric documentation (for which Paul Dubois graciously
+ made me a co-author).
+
+\end_layout
+
+\begin_layout Standard
+As I progressed with my thesis work, programming in Python was so enjoyable
+ that I felt inhibited when I worked with other programming frameworks.
+ As a result, when a task I needed to perform was not available in the core
+ language, or in the Numeric extension, I looked around and found C or Fortran
+ code that performed the needed task, wrapped it into Python (either by
+ hand or using SWIG), and used the new functionality in my programs.
+
+\end_layout
+
+\begin_layout Standard
+Along the way, I learned a great deal about the underlying structure of
+ Numeric and grew to admire it's simple but elegant structures that grew
+ out of the mechanism by which Python allows itself to be extended.
+
+\end_layout
+
+\begin_layout Note
+Numeric was originally written in 1995 based off of an earlier Matrix Object
+ design by Jim Fulton which was released in 1994.
+ Most of the code was written by Jim Hugunin while he was a graduate student
+ at MIT.
+ He received help from many people including Jim Fulton, David Ascher, Paul
+ Dubois, and Konrad Hinsen.
+ These individuals and many others added comments, criticisms, and code
+ which helped the Numeric extension reach stability.
+ Jim Hugunin did not stay long as an active member of the community ---
+ moving on to write Jython and, later, Iron Python.
+\end_layout
+
+\begin_layout Standard
+By operating in this need-it-make-it fashion I ended up with a substantial
+ library of extension modules that helped Python + Numeric become easier
+ to use in a scientific setting.
+ These early modules included raw input-output functions, a special function
+ library, an integration library, an ordinary differential equation solver,
+ some least-squares optimizers, and sparse matrix solvers.
+ While I was doing this laborious work, Pearu Peterson noticed that a lot
+ of the routines I was wrapping were written in Fortran, and there was no
+ simplified wrapping mechanism for Fortran subroutines (like SWIG for C).
+ He began the task of writing f2py which made it possible to easily wrap
+ Fortran programs into Python.
+ I helped him a little bit, mostly with testing and contributing early function-
+call-back code, but he put forth the brunt of the work.
+ His result was simply amazing to me.
+ I've always been impressed with f2py, especially because I knew how much
+ effort writing and maintaining extension modules could be.
+ Anybody serious about scientific computing with Python will appreciate
+ that f2py is distributed along with NumPy.
+\end_layout
+
+\begin_layout Standard
+When I finished my Ph.D.
+ in 2001, Eric Jones (who had recently completed his Ph.D.
+ at Duke) contacted me because he had a collection of Python modules he
+ had developed as part of his thesis work as well.
+ He wanted to combine his modules with mine into one super package.
+ Together with Pearu Peterson we joined our efforts, and SciPy was born
+ in 2001.
+ Since then, many people have contributed module code to SciPy including
+ Ed Schofield, Robert Cimrman, David M.
+ Cooke, Charles (Chuck) Harris, Prabhu Ramachandran, Gary Strangman, Jean-Sebast
+ien Roy, and Fernando Perez.
+ Others such as Travis Vaught, David Morrill, Jeff Whitaker, and Louis Luangkeso
+rn have contributed testing and build support.
+
+\end_layout
+
+\begin_layout Standard
+At the start of 2005, SciPy was at release 0.3 and relatively stable for
+ an early version number.
+ Part of the reason it was difficult to stabilize SciPy was that the array
+ object upon which SciPy builds was undergoing a bit of an upheaval.
+ At about the same time as SciPy was being built, some Numeric users were
+ hitting up against the limited capabilities of Numeric.
+ In particular, the ability to deal with memory mapped files (and associated
+ alignment and swapping issues), record arrays, and altered error checking
+ modes were important but limited or non-existent in Numeric.
+ As a result, numarray was created by Perry Greenfield, Todd Miller, and
+ Rick White at the Space Science Telescope Institute as a replacement for
+ Numeric.
+ Numarray used a very different implementation scheme as a mix of Python
+ classes and C code (which led to slow downs in certain common uses).
+ While improving some capabilities, it was slow to pick up on the more advanced
+ features of Numeric's universal functions (ufuncs) --- never re-creating
+ the C-API that SciPy depended on.
+ This made it difficult for SciPy to
+\begin_inset Quotes eld
+\end_inset
+
+convert
+\begin_inset Quotes erd
+\end_inset
+
+ to numarray.
+
+\end_layout
+
+\begin_layout Standard
+Many newcomers to scientific computing with Python were told that numarray
+ was the future and started developing for it.
+ Very useful tools were developed that could not be used with Numeric (because
+ of numarray's change in C-API), and therefore could not be used easily
+ in SciPy.
+ This state of affairs was very discouraging for me personally as it left
+ the community fragmented.
+ Some developed for numarray, others developed as part of SciPy.
+ A few people even rejected adopting Python for scientific computing entirely
+ because of the split.
+ In addition, I estimate that quite a few Python users simply stayed away
+ from both SciPy and numarray, leaving the community smaller than it could
+ have been given the number of people that use Python for science and engineerin
+g purposes.
+
+\end_layout
+
+\begin_layout Standard
+It should be recognized that the split was not intentional, but simply an
+ outgrowth of the different and exacting demands of scientific computing
+ users.
+ My describing these events should not be construed as assigning blame to
+ anyone.
+ I very much admire and appreciate everyone I've met who is involved with
+ scientific computing and Python.
+ Using a stretched biological metaphor, it is only through the process of
+ dividing and merging that better results are born.
+ I think this concept applies to NumPy.
+\end_layout
+
+\begin_layout Standard
+In early 2005, I decided to begin an effort to help bring the diverging
+ community together under a common framework if it were possible.
+ I first looked at numarray to see what could be done to add the missing
+ features to make SciPy work with it as a core array object.
+ After a couple of days of studying numarray, I was not enthusiastic about
+ this approach.
+ My familiarity with the Numeric code base no doubt biased my opinion, but
+ it seemed to me that the features of Numarray could be added back to Numeric
+ with a few fundamental changes to the core object.
+ This would make the transition of SciPy to a more enhanced array object
+ much easier in my mind.
+
+\end_layout
+
+\begin_layout Standard
+Therefore, I began to construct this hybrid array object complete with an
+ enhanced set of universal (broadcasting) functions that could deal with
+ it.
+ Along the way, quite a few new features and significant enhancements were
+ added to the array object and its surrounding infrastructure.
+ This book describes the result of that year-and-a-half-long effort which
+ culminated with the release of NumPy 0.9.2 in early 2006 and NumPy 1.0 in
+ late 2006.
+ I first named the new package, SciPy Core, and used the scipy namespace.
+ However, after a few months of testing under that name, it became clear
+ that a separate namespace was needed for the new package.
+ As a result, a rapid search for a new name resulted in actually coming
+ back to the NumPy name which was the unofficial name of Numerical Python
+ but never the actual namespace.
+ Because the new package builds on the code-base of and is a successor to
+ Numeric, I think the NumPy name is fitting and hopefully not too confusing
+ to new users.
+\end_layout
+
+\begin_layout Standard
+This book only briefly outlines some of the infrastructure that surrounds
+ the basic objects in NumPy to provide the additional functionality contained
+ in the older Numeric package (
+\emph on
+i.e.
+
+\emph default
+ LinearAlgebra, RandomArray, FFT).
+ This infrastructure in NumPy includes basic linear algebra routines, Fourier
+ transform capabilities, and random number generators.
+ In addition, the f2py module is described in its own documentation, and
+ so is only briefly mentioned in the second part of the book.
+ There are also extensions to the standard Python distutils and testing
+ frameworks included with NumPy that are useful in constructing your own
+ packages built on top of NumPy.
+ The central purpose of this book, however, is to describe and document
+ the basic NumPy system that is available under the numpy namespace.
+\end_layout
+
+\begin_layout Note
+The numpy namespace includes all names under the numpy.core and numpy.lib
+ namespaces as well.
+ Thus,
+\family typewriter
+import numpy
+\family default
+ will also import the names from numpy.core and numpy.lib.
+ This is the recommended way to use numpy.
+\end_layout
+
+\begin_layout Standard
+The following table gives a brief outline of the sub-packages contained
+ in numpy package.
+\end_layout
+
+\begin_layout Standard
+\align center
+\begin_inset Tabular
+<lyxtabular version="3" rows="9" columns="3">
+<features>
+<column alignment="center" valignment="top" leftline="true" width="1in">
+<column alignment="center" valignment="top" leftline="true" width="2in">
+<column alignment="center" valignment="top" leftline="true" rightline="true" width="2in">
+<row topline="true" bottomline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+Package
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+Purpose
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+Comments
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+core
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+basic objects
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+all names exported to numpy
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+lib
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+additional utilities
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+all names exported to numpy
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+linalg
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+basic linear algebra
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+old LinearAlgebra from Numeric
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+fft
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+discrete Fourier transforms
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+old FFT from Numeric
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+random
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+random number generators
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+old RandomArray from Numeric
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+distutils
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+enhanced build and distribution
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+improvements built on standard distutils
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+testing
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+unit-testing
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+utility functions useful for testing
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true" bottomline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+f2py
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+automatic wrapping of Fortran code
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+a useful utility needed by SciPy
+\end_layout
+
+\end_inset
+</cell>
+</row>
+</lyxtabular>
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Chapter
+Object Essentials
+\end_layout
+
+\begin_layout Quotation
+Our programs last longer if we manage to build simple abstractions for ourselves...
+\end_layout
+
+\begin_layout Right Address
+---
+\emph on
+Ron Jeffries
+\end_layout
+
+\begin_layout Quotation
+I will tell you the truth as soon as I figure it out.
+\end_layout
+
+\begin_layout Right Address
+---
+\emph on
+Wayne Birmingham
+\end_layout
+
+\begin_layout Standard
+NumPy provides two fundamental objects: an N-dimensional array object (
+\family typewriter
+ndarray
+\family default
+) and a universal function object (
+\family typewriter
+ufunc
+\family default
+).
+ In addition, there are other objects that build on top of these which you
+ may find useful in your work, and these will be discussed later.
+ The current chapter will provide background information on just the
+\family typewriter
+ndarray
+\family default
+ and the
+\family typewriter
+ufunc
+\family default
+ that will be important for understanding the attributes and methods to
+ be discussed later.
+
+\end_layout
+
+\begin_layout Standard
+An N-dimensional array is a homogeneous collection of
+\begin_inset Quotes eld
+\end_inset
+
+items
+\begin_inset Quotes erd
+\end_inset
+
+ indexed using
+\begin_inset Formula $N$
+\end_inset
+
+ integers.
+ There are two essential pieces of information that define an
+\begin_inset Formula $N$
+\end_inset
+
+-dimensional array: 1) the shape of the array, and 2) the kind of item the
+ array is composed of.
+ The shape of the array is a tuple of
+\begin_inset Formula $N$
+\end_inset
+
+ integers (one for each dimension) that provides information on how far
+ the index can vary along that dimension.
+ The other important information describing an array is the kind of item
+ the array is composed of.
+ Because every
+\family typewriter
+ndarray
+\family default
+ is a homogeneous collection of exactly the same data-type, every item takes
+ up the same size block of memory, and each block of memory in the array
+ is interpreted in exactly the same way
+\begin_inset Foot
+status open
+
+\begin_layout Standard
+By using OBJECT arrays, one can effectively have heterogeneous arrays, but
+ the system still sees each element of the array as exactly the same thing
+ (a reference to a Python object).
+\end_layout
+
+\end_inset
+
+.
+\end_layout
+
+\begin_layout Tip
+All arrays in NumPy are indexed starting at 0 and ending at M-1 following
+ the Python convention.
+\end_layout
+
+\begin_layout Standard
+For example, consider the following piece of code:
+\end_layout
+
+\begin_layout MyCode
+>>> a = array([[1,2,3],[4,5,6]])
+\newline
+>>> a.shape
+\newline
+(2, 3)
+\newline
+>>> a.dtype
+\newline
+dtype('int32')
+\end_layout
+
+\begin_layout Note
+for all code in this book it is assumed that you have first entered
+\family typewriter
+from numpy import *
+\family default
+.
+ In addition, any previously defined arrays are still defined for subsequent
+ examples.
+\end_layout
+
+\begin_layout Standard
+This code defines an array of size
+\begin_inset Formula $2\times3$
+\end_inset
+
+ composed of 4-byte (little-endian) integer elements (on my 32-bit platform).
+ We can index into this two-dimensional array using two integers: the first
+ integer running from 0 to 1 inclusive and the second from 0 to 2 inclusive.
+ For example, index
+\begin_inset Formula $\left(1,1\right)$
+\end_inset
+
+ selects the element with value 5:
+\end_layout
+
+\begin_layout MyCode
+>>> a[1,1]
+\newline
+5
+\end_layout
+
+\begin_layout Standard
+All code shown in the shaded-boxes in this book has been (automatically)
+ executed on a particular version of NumPy.
+ The output of the code shown below shows which version of NumPy was used
+ to create all of the output in your copy of this book.
+\end_layout
+
+\begin_layout MyCode
+>>> import numpy; print numpy.__version__
+\newline
+1.0.2.dev3478
+\end_layout
+
+\begin_layout Section
+Data-Type Descriptors
+\end_layout
+
+\begin_layout Standard
+In NumPy, an ndarray is an
+\begin_inset Formula $N$
+\end_inset
+
+-dimensional array of items where each item takes up a fixed number of bytes.
+ Typically, this fixed number of bytes represents a number (
+\emph on
+e.g.
+
+\emph default
+ integer or floating-point).
+ However, this fixed number of bytes could also represent an arbitrary record
+ made up of any collection of other data types.
+ NumPy achieves this flexibility through the use of a data-type (dtype)
+ object.
+ Every array has an associated dtype object which describes the layout of
+ the array data.
+ Every dtype
+\begin_inset LatexCommand index
+name "dtype"
+
+\end_inset
+
+ object, in turn, has an associated Python type-object that determines exactly
+ what type of Python object is returned when an element of the array is
+ accessed.
+ The dtype objects are flexible enough to contain references to arrays of
+ other dtype objects and, therefore, can be used to define nested records.
+ This advanced functionality will be described in better detail later as
+ it is mainly useful for the recarray (record array) subclass that will
+ also be defined later.
+ However, all ndarrays can enjoy the flexibility provided by the dtype objects.
+ Figure
+\begin_inset LatexCommand ref
+reference "cap:Conceptual-diagram-showing"
+
+\end_inset
+
+ provides a conceptual diagram showing the relationship between the ndarray,
+ its associated data-type object, and an array-scalar that is returned when
+ a single-element of the array is accessed.
+ Note that the data-type points to the type-object of the array scalar
+\begin_inset LatexCommand index
+name "array scalars"
+
+\end_inset
+
+.
+ An array scalar is returned using the type-object and a particular element
+ of the ndarray.
+\end_layout
+
+\begin_layout Standard
+\begin_inset Float figure
+wide false
+sideways false
+status open
+
+\begin_layout Standard
+\align center
+\begin_inset Graphics
+ filename Figures/threefundamental.eps
+ width 90text%
+ keepAspectRatio
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+\begin_inset Caption
+
+\begin_layout Standard
+\begin_inset LatexCommand label
+name "cap:Conceptual-diagram-showing"
+
+\end_inset
+
+Conceptual diagram showing the relationship between the three fundamental
+ objects used to describe the data in an array: 1) the ndarray itself, 2)
+ the data-type object that describes the layout of a single fixed-size element
+ of the array, 3) the array-scalar Python object that is returned when a
+ single element of the array is accessed.
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+Every dtype object is based on one of 21 built-in dtype objects.
+ These built-in objects allow numeric operations on a wide-variety of integer,
+ floating-point, and complex data types.
+ Associated with each data-type is a Python type object whose instances
+ are array scalars.
+ This type-object can be obtained using the
+\family typewriter
+type
+\family default
+ attribute of the dtype object.
+ Python typically defines only one data-type of a particular data class
+ (one integer type, one floating-point type, etc.).
+ This can be convenient for some applications that don't need to be concerned
+ with all the ways data can be represented in a computer.
+ For scientific applications, however, this is not always true.
+ As a result, in NumPy, their are 21 different fundamental Python data-type-desc
+riptor objects built-in.
+ These descriptors are mostly based on the types available in the C language
+ that CPython is written in.
+ However, there are a few types that are extremely flexible, such as
+\family typewriter
+str_
+\family default
+,
+\family typewriter
+unicode_
+\family default
+, and
+\family typewriter
+void
+\family default
+.
+\end_layout
+
+\begin_layout Standard
+The fundamental data-types are shown in Table
+\begin_inset LatexCommand ref
+reference "cap:Fundamental-Data-Types"
+
+\end_inset
+
+.
+ Along with their (mostly) C-derived names, the integer, float, and complex
+ data-types are also available using a bit-width convention so that an array
+ of the right size can always be ensured (
+\emph on
+e.g.
+
+\emph default
+ int8, float64, complex128).
+ The C-like names are also accessible using a character code which is also
+ shown in the table (use of the character codes, however, is discouraged).
+ Names for the data types that would clash with standard Python object names
+ are followed by a trailing underscore, '_'.
+ These data types are so named because they use the same underlying precision
+ as the corresponding Python data types.
+ Most scientific users should be able to use the array-enhanced scalar objects
+ in place of the Python objects.
+ The array-enhanced scalars inherit from the Python objects they can replace
+ and should act like them under all circumstances (except for how errors
+ are handled in math computations).
+
+\end_layout
+
+\begin_layout Tip
+The array types
+\series bold
+bool
+\series default
+_,
+\series bold
+int
+\series default
+_,
+\series bold
+complex
+\series default
+_,
+\series bold
+float
+\series default
+_,
+\series bold
+object
+\series default
+_,
+\series bold
+unicode
+\series default
+_, and
+\series bold
+str_
+\series default
+ are enhanced-scalars.
+ They are very similar to the standard Python types (without the trailing
+ underscore) and inherit from them (except for bool_ and object_).
+ They can be used in place of the standard Python types whenever desired.
+ Whenever a data type is required, as an argument, the standard Python types
+ are recognized as well.
+\end_layout
+
+\begin_layout Standard
+Three of the data types are flexible in that they can have items that are
+ of an arbitrary size: the
+\family typewriter
+str_
+\family default
+ type, the
+\family typewriter
+unicode_
+\family default
+ type, and the
+\family typewriter
+void
+\family default
+ type.
+ While, you can specify an arbitrary size for these types, every item in
+ an array is still of that specified size.
+ The void type, for example, allows for arbitrary records to be defined
+ as elements of the array, and can be used to define exotic types built
+ on top of the basic
+\family typewriter
+ndarray
+\family default
+.
+\end_layout
+
+\begin_layout Standard
+\begin_inset Float table
+wide false
+sideways false
+status open
+
+\begin_layout Standard
+\begin_inset Caption
+
+\begin_layout Standard
+\begin_inset LatexCommand label
+name "cap:Fundamental-Data-Types"
+
+\end_inset
+
+Built-in array-scalar types corresponding to data-types for an ndarray.
+ The bold-face types correspond to standard Python types.
+ The object_ type is special because arrays with dtype='O' do not return
+ an array scalar on item access but instead return the actual object referenced
+ in the array.
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+\align center
+\begin_inset Tabular
+<lyxtabular version="3" rows="24" columns="3">
+<features>
+<column alignment="center" valignment="top" leftline="true" width="0">
+<column alignment="center" valignment="top" leftline="true" width="0">
+<column alignment="center" valignment="top" leftline="true" rightline="true" width="0">
+<row topline="true" bottomline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+Type
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+Bit-Width
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+Character
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\series bold
+bool_
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+boolXX
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\family typewriter
+'?'
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+byte
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+intXX
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\family typewriter
+'b'
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+short
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\family typewriter
+'h'
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+intc
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\family typewriter
+'i'
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\series bold
+int_
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\family typewriter
+'l'
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+longlong
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\family typewriter
+'q'
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+intp
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\family typewriter
+'p'
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+ubyte
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+uintXX
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\family typewriter
+'B'
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+ushort
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\family typewriter
+'H'
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+uintc
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\family typewriter
+'I'
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+uint
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\family typewriter
+'L'
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+ulonglong
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\family typewriter
+'Q'
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+uintp
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\family typewriter
+'P'
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+single
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+floatXX
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\family typewriter
+'f'
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\series bold
+float_
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\family typewriter
+'d'
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+longfloat
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\family typewriter
+'g'
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+csingle
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+complexXX
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\family typewriter
+'F'
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\series bold
+complex_
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\family typewriter
+'D'
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+clongfloat
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\family typewriter
+'G'
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\series bold
+object_
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\family typewriter
+'O'
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\series bold
+str_
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\family typewriter
+'S#'
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\series bold
+unicode_
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\family typewriter
+'U#'
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true" bottomline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+void
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\family typewriter
+'V#'
+\end_layout
+
+\end_inset
+</cell>
+</row>
+</lyxtabular>
+
+\end_inset
+
+
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Note
+The two types
+\family typewriter
+intp
+\family default
+ and
+\family typewriter
+uintp
+\family default
+ are not separate types.
+ They are names bound to a specific integer type just large enough to hold
+ a memory address (a pointer) on the platform.
+\end_layout
+
+\begin_layout Warning
+Numeric Compatibility: If you used old typecode characters in your Numeric
+ code (which was never recommended), you will need to change some of them
+ to the new characters.
+ In particular, the needed changes are 'c->'S1', 'b'->'B', '1'->'b', 's'->'h',
+ 'w'->'H', and 'u'->'I'.
+ These changes make the typecharacter convention more consistent with other
+ Python modules such as the struct module.
+\end_layout
+
+\begin_layout Standard
+The fundamental data-types are arranged into a hierarchy of Python type-objects
+ shown in Figure
+\begin_inset LatexCommand ref
+reference "cap:Hierarchy-of-type"
+
+\end_inset
+
+.
+ Each of the leaves on this hierarchy correspond to actual data-types that
+ arrays can have (in other words, there is a built in dtype object associated
+ with each of these new types).
+ They also correspond to new Python objects that can be created.
+ These new objects are
+\begin_inset Quotes eld
+\end_inset
+
+scalar
+\begin_inset Quotes erd
+\end_inset
+
+ types corresponding to each fundamental data-type.
+ Their purpose is to smooth out the rough edges that result when mixing
+ scalar and array operations.
+ These scalar objects will be discussed in more detail in Chapter
+\begin_inset LatexCommand ref
+reference "cha:Scalar-objects"
+
+\end_inset
+
+.
+ The other types in the hierarchy define particular categories of types.
+ These categories can be useful for testing whether or not the object returned
+ by
+\family typewriter
+self.dtype.type
+\family default
+ is of a particular class (using
+\family typewriter
+issubclass
+\family default
+).
+\end_layout
+
+\begin_layout Standard
+\begin_inset Float figure
+wide false
+sideways false
+status open
+
+\begin_layout Standard
+\align center
+\begin_inset Graphics
+ filename Figures/hierarchy.eps
+ lyxscale 75
+ width 95text%
+ keepAspectRatio
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+\begin_inset Caption
+
+\begin_layout Standard
+\begin_inset LatexCommand label
+name "cap:Hierarchy-of-type"
+
+\end_inset
+
+Hierarchy of type objects representing the array data types.
+ Not shown are the two integer types
+\family typewriter
+intp
+\family default
+ and
+\family typewriter
+uintp
+\family default
+ which just point to the integer type that holds a pointer for the platform.
+ All the number types can be obtained using bit-width names as well.
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Section
+Basic indexing (slicing)
+\end_layout
+
+\begin_layout Standard
+Indexing
+\begin_inset LatexCommand index
+name "indexing"
+
+\end_inset
+
+ is a powerful tool in Python and NumPy takes full advantage of this power.
+ In fact, some of capabilities of Python's indexing were first established
+ by the needs of Numeric users.
+\begin_inset Foot
+status open
+
+\begin_layout Standard
+For example, the ability to index with a comma separated list of objects
+ and have it correspond to indexing with a tuple is a feature added to Python
+ at the request of the NumPy community.
+ The Ellipsis object was also added to Python explicitly for the NumPy community.
+ Extended slicing (wherein a step can be provided) was also a feature added
+ to Python because of Numeric.
+\end_layout
+
+\end_inset
+
+ Indexing is also sometimes called slicing in Python, and slicing for an
+
+\family typewriter
+ndarray
+\family default
+ works very similarly as it does for other Python sequences.
+ There are three big differences: 1) slicing can be done over multiple dimension
+s, 2) exactly one ellipsis object can be used to indicate several dimensions
+ at once, 3) slicing cannot be used to expand the size of an array (unlike
+ lists).
+\end_layout
+
+\begin_layout Standard
+A few examples should make slicing more clear.
+ Suppose
+\begin_inset Formula $A$
+\end_inset
+
+ is a
+\begin_inset Formula $10\times20$
+\end_inset
+
+ array, then
+\begin_inset Formula $A[3]$
+\end_inset
+
+ is the same as
+\begin_inset Formula $A[3,:]$
+\end_inset
+
+ and represents the 4th length-20
+\begin_inset Quotes eld
+\end_inset
+
+row
+\begin_inset Quotes erd
+\end_inset
+
+ of the array.
+ On the other hand,
+\begin_inset Formula $A[:,3]$
+\end_inset
+
+ represents the 4th length-10
+\begin_inset Quotes eld
+\end_inset
+
+column
+\begin_inset Quotes erd
+\end_inset
+
+ of the array.
+ Every third element of the 4th column can be selected as
+\begin_inset Formula $A[::3,3]$
+\end_inset
+
+.
+ Ellipses can be used to replace zero or more
+\begin_inset Quotes eld
+\end_inset
+
+:
+\begin_inset Quotes erd
+\end_inset
+
+ terms.
+ In other words, an Ellipsis
+\begin_inset LatexCommand index
+name "Ellipsis"
+
+\end_inset
+
+ object expands to zero or more full slice objects (
+\begin_inset Quotes eld
+\end_inset
+
+:
+\begin_inset Quotes erd
+\end_inset
+
+) so that the total number of dimensions in the slicing tuple matches the
+ number of dimensions in the array.
+ Thus, if
+\begin_inset Formula $A$
+\end_inset
+
+ is
+\begin_inset Formula $10\times20\times30\times40$
+\end_inset
+
+, then
+\begin_inset Formula $A[3:,...,4]$
+\end_inset
+
+ is equivalent to
+\begin_inset Formula $A[3:,:,:,4]$
+\end_inset
+
+ while
+\begin_inset Formula $A[...,3]$
+\end_inset
+
+ is equivalent to
+\begin_inset Formula $A[:,:,:,3].$
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+The following code illustrates some of these concepts:
+\end_layout
+
+\begin_layout MyCode
+>>> a = arange(60).reshape(3,4,5); print a
+\newline
+[[[ 0 1 2 3 4]
+\newline
+ [ 5 6 7
+ 8 9]
+\newline
+ [10 11 12 13 14]
+\newline
+ [15 16 17 18 19]]
+\newline
+
+\newline
+ [[20 21 22 23 24]
+\newline
+ [25 26 27
+ 28 29]
+\newline
+ [30 31 32 33 34]
+\newline
+ [35 36 37 38 39]]
+\newline
+
+\newline
+ [[40 41 42 43 44]
+\newline
+ [45 46 47
+ 48 49]
+\newline
+ [50 51 52 53 54]
+\newline
+ [55 56 57 58 59]]]
+\end_layout
+
+\begin_layout Standard
+\InsetSpace ~
+
+\end_layout
+
+\begin_layout MyCode
+>>> print a[...,3]
+\newline
+[[ 3 8 13 18]
+\newline
+ [23 28 33 38]
+\newline
+ [43 48 53 58]]
+\newline
+>>> print a[1,...,3]
+\newline
+[23
+ 28 33 38]
+\newline
+>>> print a[:,:,2]
+\newline
+[[ 2 7 12 17]
+\newline
+ [22 27 32 37]
+\newline
+ [42 47 52 57]]
+\newline
+>>>
+ print a[0,::2,::2]
+\newline
+[[ 0 2 4]
+\newline
+ [10 12 14]]
+\end_layout
+
+\begin_layout Section
+Memory Layout of
+\family typewriter
+ndarray
+\end_layout
+
+\begin_layout Standard
+On a fundamental level, an
+\begin_inset Formula $N$
+\end_inset
+
+-dimensional array object is just a one-dimensional sequence of memory with
+ fancy indexing code that maps an
+\begin_inset Formula $N$
+\end_inset
+
+-dimensional index into a one-dimensional index.
+ The one-dimensional index is necessary on some level because that is how
+ memory is addressed in a computer.
+ The fancy indexing, however, can be very helpful for translating our ideas
+ into computer code.
+ This is because many concepts we wish to model on a computer have a natural
+ representation as an
+\begin_inset Formula $N$
+\end_inset
+
+-dimensional array.
+ While this is especially true in science and engineering, it is also applicable
+ to many other arenas which can be appreciated by considering the popularity
+ of the spreadsheet as well as
+\begin_inset Quotes eld
+\end_inset
+
+image processing
+\begin_inset Quotes erd
+\end_inset
+
+ applications.
+\end_layout
+
+\begin_layout Warning
+Some high-level languages give pre-eminence to a particular use of 2-dimensional
+ arrays as Matrices.
+ In NumPy, however, the core object is the more general
+\begin_inset Formula $N$
+\end_inset
+
+-dimensional array.
+ NumPy defines a matrix object as a sub-class of the N-dimensional array.
+
+\end_layout
+
+\begin_layout Standard
+In order to more fully understand the array object along with its attributes
+ and methods it is important to learn more about how an
+\begin_inset Formula $N$
+\end_inset
+
+-dimensional array is represented in the computer's memory.
+ A complete understanding of this layout is only essential for optimizing
+ algorithms operating on general purpose arrays.
+ But, even for the casual user, a general understanding of memory layout
+ will help to explain the use of certain array attributes that may otherwise
+ be mysterious.
+
+\end_layout
+
+\begin_layout Subsection
+Contiguous Memory Layout
+\end_layout
+
+\begin_layout Standard
+There is a fundamental ambiguity in how the mapping to a one-dimensional
+ index can take place which is illustrated for a 2-dimensional array in
+ Figure
+\begin_inset LatexCommand ref
+reference "cap:Options-for-memory"
+
+\end_inset
+
+.
+ In that figure, each block represents a chunk of memory that is needed
+ for representing the underlying array element.
+ For example, each block could represent the 8 bytes needed to represent
+ a double-precision floating point number.
+
+\end_layout
+
+\begin_layout Standard
+In the figure, two arrays are shown, a
+\begin_inset Formula $4x3$
+\end_inset
+
+ array and a
+\begin_inset Formula $3x4$
+\end_inset
+
+ array.
+ Each of these arrays takes 12 blocks of memory shown as a single, contiguous
+ segment.
+ How this memory is used to form the abstract 2-dimensional array can vary,
+ however, and the
+\family typewriter
+ndarray
+\family default
+ object supports both styles.
+ Which style is in use can be interrogated by the use of the flags attribute
+ which returns a dictionary of the state of array flags.
+
+\end_layout
+
+\begin_layout Standard
+\begin_inset Float figure
+wide false
+sideways false
+status open
+
+\begin_layout Standard
+\align center
+\begin_inset Graphics
+ filename Figures/contiguous.eps
+ width 85text%
+ keepAspectRatio
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+\begin_inset Caption
+
+\begin_layout Standard
+\begin_inset LatexCommand label
+name "cap:Options-for-memory"
+
+\end_inset
+
+Options for memory layout of a 2-dimensional array.
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+In the C-style of
+\begin_inset Formula $N$
+\end_inset
+
+-dimensional indexing shown on the left of Figure
+\begin_inset LatexCommand ref
+reference "cap:Options-for-memory"
+
+\end_inset
+
+ the last
+\begin_inset Formula $N$
+\end_inset
+
+-dimensional index
+\begin_inset Quotes eld
+\end_inset
+
+varies the fastest.
+\begin_inset Quotes erd
+\end_inset
+
+ In other words, to move through computer memory sequentially, the last
+ index is incremented first, followed by the second-to-last index and so
+ forth.
+ Some of the algorithms in NumPy that deal with
+\begin_inset Formula $N$
+\end_inset
+
+-dimensional arrays work best with this kind of data.
+
+\end_layout
+
+\begin_layout Standard
+In the Fortran-style of
+\begin_inset Formula $N$
+\end_inset
+
+-dimensional indexing shown on the right of Figure
+\begin_inset LatexCommand ref
+reference "cap:Options-for-memory"
+
+\end_inset
+
+, the first
+\begin_inset Formula $N$
+\end_inset
+
+-dimensional index
+\begin_inset Quotes eld
+\end_inset
+
+varies the fastest.
+\begin_inset Quotes erd
+\end_inset
+
+ Thus, to move through computer memory sequentially, the first index is
+ incremented first until it reaches the limit in that dimension, then the
+ second index is incremented and the first index is reset to zero.
+ While NumPy can be compiled without the use of a Fortran compiler, several
+ modules of SciPy (available separately) rely on underlying algorithms written
+ in Fortran.
+ Algorithms that work on
+\begin_inset Formula $N$
+\end_inset
+
+-dimensional arrays that are written in Fortran typically expect Fortran-style
+ arrays.
+
+\end_layout
+
+\begin_layout Standard
+The two-styles of memory layout for arrays are connected through the transpose
+ operation.
+ Thus, if
+\begin_inset Formula $A$
+\end_inset
+
+ is a (contiguous) C-style array, then the same block of memory can be used
+ to represent
+\begin_inset Formula $A^{T}$
+\end_inset
+
+ as a (contiguous) Fortran-style array.
+ This kind of understanding can be useful when trying to optimize the wrapping
+ of Fortran subroutines, or if a more detailed understanding of how to write
+ algorithms for generally-indexed arrays is desired.
+ But, fortunately, the casual user who does not care if an array is copied
+ occasionally to get it into the right orientation needed for a particular
+ algorithm can forget about how the array is stored in memory and just visualize
+ it as an
+\begin_inset Formula $N$
+\end_inset
+
+-dimensional array (that is, after all, the whole point of creating the
+
+\family typewriter
+ndarray
+\family default
+ object in the first place).
+
+\end_layout
+
+\begin_layout Subsection
+Non-contiguous memory layout
+\end_layout
+
+\begin_layout Standard
+Both of the examples presented above are
+\emph on
+single-segment
+\begin_inset LatexCommand index
+name "single-segment"
+
+\end_inset
+
+
+\emph default
+ arrays where the entire array is visited by sequentially marching through
+ memory one element at a time.
+ When an algorithm in C or Fortran expects an N-dimensional array, this
+ single segment (of a certain fundamental type) is usually what is expected
+ along with the shape
+\begin_inset Formula $N$
+\end_inset
+
+-tuple.
+ With a single-segment of memory representing the array, the one-dimensional
+ index into computer memory can always be computed from the
+\begin_inset Formula $N$
+\end_inset
+
+-dimensional index.
+ This concept is explored further in the following paragraphs.
+\end_layout
+
+\begin_layout Standard
+Let
+\begin_inset Formula $n_{i}$
+\end_inset
+
+ be the value of the
+\begin_inset Formula $i^{\textrm{th}}$
+\end_inset
+
+ index into an array whose shape is represented by the
+\begin_inset Formula $N$
+\end_inset
+
+ integers
+\begin_inset Formula $d_{i}$
+\end_inset
+
+ (
+\begin_inset Formula $i=0\ldots N-1).$
+\end_inset
+
+ Then, the one-dimensional index into a C-style contiguous array is
+\begin_inset Formula \[
+n^{C}=\sum_{i=0}^{N-1}n_{i}\prod_{j=i+1}^{N-1}d_{j}\]
+
+\end_inset
+
+ while the one-dimensional index into a Fortran-style contiguous array is
+
+\begin_inset Formula \[
+n^{F}=\sum_{i=0}^{N-1}n_{i}\prod_{j=0}^{i-1}d_{j}.\]
+
+\end_inset
+
+ In these formulas we are assuming that
+\begin_inset Formula \[
+\prod_{j=k}^{m}d_{j}=d_{k}d_{k+1}\cdots d_{m-1}d_{m}\]
+
+\end_inset
+
+so that if
+\begin_inset Formula $m<k,$
+\end_inset
+
+ the product is
+\begin_inset Formula $1.$
+\end_inset
+
+ While perfectly general, these formulas may be a bit confusing at first
+ glimpse.
+ Let's see how they expand out for determining the one-dimensional index
+ corresponding to the element
+\begin_inset Formula $\left(1,3,2\right)$
+\end_inset
+
+ of a
+\begin_inset Formula $4\times5\times6$
+\end_inset
+
+ array.
+ If the array is stored as Fortran contiguous, then
+\begin_inset Formula \begin{eqnarray*}
+n^{F} & = & n_{0}\cdot\left(1\right)+n_{1}\cdot(4)+n_{2}\cdot\left(4\cdot5\right)\\
+ & = & 1+3\cdot4+2\cdot20=53.\end{eqnarray*}
+
+\end_inset
+
+ On the other hand, if the array is stored as C contiguous, then
+\begin_inset Formula \begin{eqnarray*}
+n^{C} & = & n_{0}\cdot\left(5\cdot6\right)+n_{1}\cdot\left(6\right)+n_{2}\cdot\left(1\right)\\
+ & = & 1\cdot30+3\cdot6+2\cdot1=50.\end{eqnarray*}
+
+\end_inset
+
+ The general pattern should be more clear from these examples.
+
+\end_layout
+
+\begin_layout Standard
+The formulas for the one-dimensional index of the N-dimensional arrays reveal
+ what results in an important generalization for memory layout.
+ Notice that each formula can be written as
+\begin_inset Formula \[
+n^{X}=\sum_{i=0}^{N-1}n_{i}s_{i}^{X}\]
+
+\end_inset
+
+ where
+\begin_inset Formula $s_{i}^{X}$
+\end_inset
+
+ gives the
+\emph on
+stride
+\begin_inset LatexCommand index
+name "stride"
+
+\end_inset
+
+
+\emph default
+ for dimension
+\begin_inset Formula $i$
+\end_inset
+
+.
+\begin_inset Foot
+status open
+
+\begin_layout Standard
+Our definition of stride here is an element-based stride, while the strides
+ attribute returns a byte-based stride.
+ The byte-based stride is the element itemsize multiplied by the element-based
+ stride.
+\end_layout
+
+\end_inset
+
+ Thus, for C and Fortran contiguous arrays respectively we have
+\begin_inset Formula \begin{eqnarray*}
+s_{i}^{C} & = & \prod_{j=i+1}^{N-1}d_{j}=d_{i+1}d_{i+2}\cdots d_{N-1},\\
+s_{i}^{F} & = & \prod_{j=0}^{i-1}d_{j}=d_{0}d_{1}\cdots d_{i-1}.\end{eqnarray*}
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+The stride is how many elements in the underlying one-dimensional layout
+ of the array one must jump in order to get to the next array element of
+ a specific dimension in the N-dimensional layout.
+ Thus, in a C-style
+\begin_inset Formula $4\times5\times6$
+\end_inset
+
+ array one must jump over 30 elements to increment the first index by one,
+ so 30 is the stride for the first dimension (
+\begin_inset Formula $s_{0}^{C}=30$
+\end_inset
+
+).
+ If, for each array, we define a strides tuple with
+\begin_inset Formula $N$
+\end_inset
+
+ integers, then we have pre-computed and stored an important piece of how
+ to map the
+\begin_inset Formula $N$
+\end_inset
+
+-dimensional index to the one-dimensional one used by the computer.
+
+\end_layout
+
+\begin_layout Standard
+In addition to providing a pre-computed table for index mapping, by allowing
+ the strides tuple to consist of arbitrary integers we have provided a more
+ general layout for the
+\begin_inset Formula $N$
+\end_inset
+
+-dimensional array.
+ As long as we always use the stride information to move around in the
+\begin_inset Formula $N$
+\end_inset
+
+-dimensional array, we can use any convenient layout we wish for the underlying
+ representation as long as it is regular enough to be defined by constant
+ jumps in each dimension.
+ The
+\family typewriter
+ndarray
+\family default
+ object of NumPy uses this stride information and therefore the underlying
+ memory of an
+\family typewriter
+ndarray
+\family default
+ can be laid out dis-contiguously.
+
+\end_layout
+
+\begin_layout Note
+Several algorithms in NumPy work on arbitrarily strided arrays.
+ However, some algorithms require single-segment arrays.
+ When an irregularly strided array is passed in to such algorithms, a copy
+ is automatically made.
+
+\end_layout
+
+\begin_layout Standard
+An important situation where irregularly strided arrays occur is array indexing.
+ Consider again Figure
+\begin_inset LatexCommand ref
+reference "cap:Options-for-memory"
+
+\end_inset
+
+.
+ In that figure a high-lighted sub-array is shown.
+ Define
+\begin_inset Formula $C$
+\end_inset
+
+ to be the
+\begin_inset Formula $4\times3$
+\end_inset
+
+ C contiguous array and
+\begin_inset Formula $F$
+\end_inset
+
+ to be the
+\begin_inset Formula $3\times4$
+\end_inset
+
+ Fortran contiguous array.
+ The highlighted areas can be written respectively as
+\begin_inset Formula $C$
+\end_inset
+
+[1:3,1:3] and
+\begin_inset Formula $F$
+\end_inset
+
+[1:3,1:3].
+ As evidenced by the corresponding highlighted region in the one-dimensional
+ view of the memory, these sub-arrays are neither C contiguous nor Fortran
+ contiguous.
+ However, they can still be represented by an
+\family typewriter
+ndarray
+\family default
+ object using the same striding tuple as the original array used.
+ Therefore, a regular indexing expression on an
+\family typewriter
+ndarray
+\family default
+ can always produce an
+\family typewriter
+ndarray
+\family default
+ object
+\emph on
+without
+\emph default
+ copying any data.
+ This is sometimes referred to as the
+\begin_inset Quotes eld
+\end_inset
+
+view
+\begin_inset Quotes erd
+\end_inset
+
+ feature of array indexing, and one can see that it is enabled by the use
+ of striding information in the underlying
+\family typewriter
+ndarray
+\family default
+ object.
+ The greatest benefit of this feature is that it allows indexing to be done
+ very rapidly and without exploding memory usage (because no copies of the
+ data are made).
+\end_layout
+
+\begin_layout Section
+Universal Functions for arrays
+\end_layout
+
+\begin_layout Standard
+NumPy provides a wealth of mathematical functions that operate on then ndarray
+ object.
+ From algebraic functions such as addition and multiplication to trigonometric
+ functions such as
+\begin_inset Formula $\sin,$
+\end_inset
+
+ and
+\begin_inset Formula $\cos$
+\end_inset
+
+.
+ Each universal function
+\begin_inset LatexCommand index
+name "universal function"
+
+\end_inset
+
+ (
+\family typewriter
+ufunc
+\family default
+
+\begin_inset LatexCommand index
+name "ufunc"
+
+\end_inset
+
+) is an instance of a general class so that function behavior is the same.
+ All ufuncs perform element-by-element operations over an array or a set
+ of arrays (for multi-input functions).
+ The ufuncs themselves and their methods are documented in Part
+\begin_inset LatexCommand ref
+reference "par:The-Ufunc-Object"
+
+\end_inset
+
+.
+
+\end_layout
+
+\begin_layout Standard
+One important aspect of ufunc behavior that should be introduced early,
+ however, is the idea of
+\emph on
+
+\begin_inset LatexCommand index
+name "broadcasting"
+
+\end_inset
+
+broadcasting
+\emph default
+.
+ Broadcasting is used in several places throughout NumPy and is therefore
+ worth early exposure.
+ To understand the idea of broadcasting, you first have to be conscious
+ of the fact that all ufuncs are always element-by-element operations.
+ In other words, suppose we have a ufunc with two inputs and one output
+ (
+\emph on
+e.g.
+
+\emph default
+ addition) and the inputs are both arrays of shape
+\begin_inset Formula $4\times6\times5$
+\end_inset
+
+.
+ Then, the output is going to be
+\begin_inset Formula $4\times6\times5$
+\end_inset
+
+, and will be the result of applying the underlying function (
+\emph on
+e.g.
+
+\emph default
+
+\begin_inset Formula $+$
+\end_inset
+
+) to each pair of inputs to produce the output at the corresponding
+\begin_inset Formula $N$
+\end_inset
+
+-dimensional location.
+
+\end_layout
+
+\begin_layout Standard
+Broadcasting allows ufuncs to deal in a meaningful way with inputs that
+ do not have exactly the same shape.
+ In particular, the first rule of broadcasting is that if all input arrays
+ do not have the same number of dimensions, then a
+\begin_inset Quotes eld
+\end_inset
+
+
+\begin_inset Formula $1$
+\end_inset
+
+
+\begin_inset Quotes erd
+\end_inset
+
+ will be repeatedly pre-pended to the shapes of the smaller arrays until
+ all the arrays have the same number of dimensions.
+ The second rule of broadcasting ensures that arrays with a size of 1 along
+ a particular dimension act as if they had the size of the array with the
+ largest shape along that dimension.
+ The value of the array element is assumed to be the same along that dimension
+ for the
+\begin_inset Quotes eld
+\end_inset
+
+broadcasted
+\begin_inset Quotes erd
+\end_inset
+
+ array.
+ After application of the broadcasting rules, the sizes of all arrays must
+ match.
+\end_layout
+
+\begin_layout Standard
+While a little tedious to explain, the broadcasting rules are easy to pick
+ up by looking at a couple of examples.
+ Suppose there is a
+\family typewriter
+ufunc
+\family default
+ with two inputs,
+\begin_inset Formula $A$
+\end_inset
+
+ and
+\begin_inset Formula $B$
+\end_inset
+
+.
+ Now supposed that
+\begin_inset Formula $A$
+\end_inset
+
+ has shape
+\begin_inset Formula $4\times6\times5$
+\end_inset
+
+ while
+\begin_inset Formula $B$
+\end_inset
+
+ has shape
+\begin_inset Formula $4\times6\times1$
+\end_inset
+
+.
+ The ufunc will proceed to compute the
+\begin_inset Formula $4\times6\times5$
+\end_inset
+
+ output as if
+\begin_inset Formula $B$
+\end_inset
+
+ had been
+\begin_inset Formula $4\times6\times5$
+\end_inset
+
+ by assuming that
+\begin_inset Formula $B[...,k]=B[...,0]$
+\end_inset
+
+ for
+\begin_inset Formula $k=1,2,3,4$
+\end_inset
+
+.
+
+\end_layout
+
+\begin_layout Standard
+Another example illustrates the idea of adding
+\begin_inset Formula $1$
+\end_inset
+
+'s to the beginning of the array shape-tuple.
+ Suppose
+\begin_inset Formula $A$
+\end_inset
+
+ is the same as above, but
+\begin_inset Formula $B$
+\end_inset
+
+ is a length
+\begin_inset Formula $5$
+\end_inset
+
+ array.
+ Because of the first rule,
+\begin_inset Formula $B$
+\end_inset
+
+ will be interpreted as a
+\begin_inset Formula $1\times1\times5$
+\end_inset
+
+ array, and then because of the second rule
+\begin_inset Formula $B$
+\end_inset
+
+ will be interpreted as a
+\begin_inset Formula $4\times6\times5$
+\end_inset
+
+ array by repeating the elements of
+\begin_inset Formula $B$
+\end_inset
+
+ in the obvious way.
+
+\end_layout
+
+\begin_layout Standard
+The most common alteration needed is to route-around the automatic pre-pending
+ of 1's to the shape of the array.
+ If it is desired, to add
+\begin_inset Formula $1$
+\end_inset
+
+'s to the end of the array shape, then dimensions can always be added using
+ the
+\family typewriter
+newaxis
+\family default
+ name in NumPy:
+\begin_inset Formula $B[...,\textrm{newaxis, newaxis}]$
+\end_inset
+
+ returns an array with 2 additional 1's appended to the shape of
+\begin_inset Formula $B.$
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+One important aspect of broadcasting is the calculation of functions on
+ regularly spaced grids.
+ For example, suppose it is desired to show a portion of the multiplication
+ table by computing the function
+\begin_inset Formula $a*b$
+\end_inset
+
+ on a grid with
+\begin_inset Formula $a$
+\end_inset
+
+ running from 6 to 9 and
+\begin_inset Formula $b$
+\end_inset
+
+ running from 12 to 16.
+ The following code illustrates how this could be done using ufuncs and
+ broadcasting.
+
+\end_layout
+
+\begin_layout MyCode
+>>> a = arange(6, 10); print a
+\newline
+[6 7 8 9]
+\newline
+>>> b = arange(12, 17); print b
+\newline
+[12
+ 13 14 15 16]
+\newline
+>>> table = a[:,newaxis] * b
+\newline
+>>> print table
+\newline
+[[ 72 78 84 90
+ 96]
+\newline
+ [ 84 91 98 105 112]
+\newline
+ [ 96 104 112 120 128]
+\newline
+ [108 117 126 135 144]]
+\end_layout
+
+\begin_layout Section
+Summary of new features
+\end_layout
+
+\begin_layout Standard
+More information about using arrays in Python can be found in the old Numeric
+ documentation at
+\begin_inset LatexCommand htmlurl
+name "http://numeric.scipy.org"
+target "http://numeric.scipy.org"
+
+\end_inset
+
+.
+ Quite a bit of that documentation is still accurate, especially in the
+ discussion of array basics.
+ There are significant differences, however, and this book seeks to explain
+ them in detail.
+ The following list tries to summarize the significant new features (over
+ Numeric) available in the
+\family typewriter
+ndarray
+\family default
+ and
+\family typewriter
+ufunc
+\family default
+ objects of NumPy:
+\end_layout
+
+\begin_layout Enumerate
+more data types (all standard C-data types plus complex floats, Boolean,
+ string, unicode, and void *);
+\end_layout
+
+\begin_layout Enumerate
+flexible data types where each array can have a different itemsize (but
+ all elements of the same array still have the same itemsize);
+\end_layout
+
+\begin_layout Enumerate
+there is a true Python scalar type (contained in a hierarchy of types) for
+ every data-type an array can have;
+\end_layout
+
+\begin_layout Enumerate
+data-type objects define the data-type with support for data-type objects
+ with fields and subarrays which allow record arrays with nested records;
+\end_layout
+
+\begin_layout Enumerate
+many more array methods in addition to functional counterparts;
+\end_layout
+
+\begin_layout Enumerate
+attributes more clearly distinguished from methods (attributes are intrinsic
+ parts of an array so that setting them changes the array itself);
+\end_layout
+
+\begin_layout Enumerate
+array scalars covering all data types which inherit from Python scalars
+ when appropriate;
+\end_layout
+
+\begin_layout Enumerate
+arrays can be misaligned, swapped, and in Fortran order in memory (facilitates
+ memory-mapped arrays);
+\end_layout
+
+\begin_layout Enumerate
+arrays can be more easily read from text files and created from buffers
+ and iterators;
+\end_layout
+
+\begin_layout Enumerate
+arrays can be quickly written to files in text and/or binary mode;
+\end_layout
+
+\begin_layout Enumerate
+arrays support the removal of the 64-bit memory limitation as long as you
+ have Python 2.5 or later;
+\end_layout
+
+\begin_layout Enumerate
+fancy indexing can be done on arrays using integer sequences and Boolean
+ masks;
+\end_layout
+
+\begin_layout Enumerate
+coercion rules are altered for mixed scalar / array operations so that scalars
+ (anything that produces a 0-dimensional array internally) will not determine
+ the output type in such cases.
+\end_layout
+
+\begin_layout Enumerate
+when coercion is needed, temporary buffer-memory allocation is limited to
+ a user-adjustable size;
+\end_layout
+
+\begin_layout Enumerate
+errors are handled through the IEEE floating point status flags and there
+ is flexibility on a per-thread level for handling these errors;
+\end_layout
+
+\begin_layout Enumerate
+one can register an error callback function in Python to handle errors are
+ set to 'call' for their error handling;
+\end_layout
+
+\begin_layout Enumerate
+ufunc reduce, accumulate, and reduceat can take place using a different
+ type then the array type if desired (without copying the entire array);
+\end_layout
+
+\begin_layout Enumerate
+ufunc output arrays passed in can be a different type than expected from
+ the calculation;
+\end_layout
+
+\begin_layout Enumerate
+ufuncs take keyword arguments which can specify 1) the error handling explicitly
+ and 2) the specific 1-d loop to use by-passing the type-coercion detection.
+
+\end_layout
+
+\begin_layout Enumerate
+arbitrary classes can be passed through ufuncs (__array_wrap__ and __array_prior
+ity__ expand previous __array__ method);
+\end_layout
+
+\begin_layout Enumerate
+ufuncs can be easily created from Python functions;
+\end_layout
+
+\begin_layout Enumerate
+ufuncs have attributes to detail their behavior, including a dynamic doc
+ string that automatically generates the calling signature;
+\end_layout
+
+\begin_layout Enumerate
+several new ufuncs (frexp, modf, ldexp, isnan, isfinite, isinf, signbit);
+\end_layout
+
+\begin_layout Enumerate
+new types can be registered with the system so that specialized ufunc loops
+ can be written over new type objects;
+\end_layout
+
+\begin_layout Enumerate
+new types can also register casting functions and rules for fitting into
+ the
+\begin_inset Quotes eld
+\end_inset
+
+can-cast
+\begin_inset Quotes erd
+\end_inset
+
+ hierarchy;
+\end_layout
+
+\begin_layout Enumerate
+C-API enhanced so that more of the functionality is available from compiled
+ code;
+\end_layout
+
+\begin_layout Enumerate
+C-API enhanced so array structure access can take place through macros;
+\end_layout
+
+\begin_layout Enumerate
+new iterator objects created for easy handling in C of non-contiguous arrays;
+\end_layout
+
+\begin_layout Enumerate
+new multi-iterator object created for easy handling in C of broadcasting;
+\end_layout
+
+\begin_layout Enumerate
+types have more functions associated with them (no magic function lists
+ in the C-code).
+ Any function needed is part of the type structure.
+\end_layout
+
+\begin_layout Standard
+All of these enhancements will be documented more thoroughly in the remaining
+ portions of this book.
+\end_layout
+
+\begin_layout Section
+Summary of differences with Numeric
+\end_layout
+
+\begin_layout Standard
+An effort was made to retain backwards compatibility with Numeric all the
+ way to the C-level.
+ This was mostly accomplished, with a few changes that needed to be made
+ for consistency of the new system.
+ If you are just starting out with NumPy, then this section may be skipped.
+\end_layout
+
+\begin_layout Standard
+There are two steps (one required and one optional) to converting code that
+ works with Numeric to work fully with NumPy The first step uses a compatibility
+ layer and requires only small changes which can be handled by the numpy.oldnumer
+ic.alter_code1 module.
+ Code written to the compatibility layer will work and be supported.
+ The purpose of the compatibility layer is to make it easy to convert to
+ NumPy and many codes may only take this first step and work fine with NumPy.
+ The second step is optional as it removes dependency on the compatibility
+ layer and therefore requires a few more extensive changes.
+ Many of these changes can be performed by the numpy.oldnumeric.alter_code2
+ module, but you may still need to do some final tweaking by hand.
+ Because many users will probably be content to only use the first step,
+ the alter_code2 module for second-stage migration may not be as complete
+ as it otherwise could be.
+
+\end_layout
+
+\begin_layout Subsection
+First-step changes
+\end_layout
+
+\begin_layout Standard
+In order to use the compatibility layer there are still a few changes that
+ need to be made to your code.
+ Many of these changes can be made by running the alter_code1 module with
+ your code as input.
+
+\end_layout
+
+\begin_layout Enumerate
+Importing (the alter_code1 module handles all these changes)
+\end_layout
+
+\begin_deeper
+\begin_layout Enumerate
+import Numeric --> import numpy.oldnumeric as Numeric
+\end_layout
+
+\begin_layout Enumerate
+import Numeric as XX --> import numpy.oldnumeric as XX
+\end_layout
+
+\begin_layout Enumerate
+from Numeric import <name1>,...<nameN> --> from numpy.oldnumeric import <name1>,...,<na
+meN>
+\end_layout
+
+\begin_layout Enumerate
+from Numeric import * --> from numpy.oldnumeric import *
+\end_layout
+
+\begin_layout Enumerate
+Similar name changes need to be made for Matrix, MLab, UserArray, LinearAlgebra,
+ RandomArray RNG, RNG.Statistics, and FFT.
+ The new names are numpy.oldnumeric.<pkg> where <pkg> is matrix, mlab, user_array,
+ linear_algebra, random_array, rng, rng_stats, and fft.
+
+\end_layout
+
+\begin_layout Enumerate
+multiarray and umath (if you used them directly) are now numpy.core.multiarray
+ and numpy.core.umath, but it is more future proof to replace usages of these
+ internal modules with numpy.oldnumeric.
+\end_layout
+
+\end_deeper
+\begin_layout Enumerate
+Method name changes and methods converted to attributes.
+ The alter_code1 module handles all these changes.
+
+\end_layout
+
+\begin_deeper
+\begin_layout Enumerate
+
+\emph on
+arr
+\emph default
+.typecode() -->
+\emph on
+arr
+\emph default
+.dtype.char
+\end_layout
+
+\begin_layout Enumerate
+
+\emph on
+arr
+\emph default
+.iscontiguous() -->
+\emph on
+arr
+\emph default
+.flags.contiguous
+\end_layout
+
+\begin_layout Enumerate
+
+\emph on
+arr
+\emph default
+.byteswapped() -->
+\emph on
+arr
+\emph default
+.byteswap()
+\end_layout
+
+\begin_layout Enumerate
+
+\emph on
+arr
+\emph default
+.toscalar() -->
+\emph on
+arr
+\emph default
+.item()
+\end_layout
+
+\begin_layout Enumerate
+
+\emph on
+arr
+\emph default
+.itemsize() -->
+\emph on
+arr
+\emph default
+.itemsize
+\end_layout
+
+\begin_layout Enumerate
+
+\emph on
+arr
+\emph default
+.spacesaver() eliminated
+\end_layout
+
+\begin_layout Enumerate
+
+\emph on
+arr
+\emph default
+.savespace() eliminated
+\end_layout
+
+\end_deeper
+\begin_layout Enumerate
+Some of the typecode characters have changed to be more consistent with
+ other Python modules (array and struct).
+ You should only notice this change if you used the actual typecode characters
+ (instead of the named constants).
+
+\newline
+The alter_code1 module will change uses of 'b' to 'B' for internal Numeric
+ functions that it knows about because NumPy will interpret 'b' to mean
+ a signed byte type (instead of the old unsigned).
+ It will also change the character codes when they are used explicitly in
+ the .astype method.
+ In the compatibility layer (and only in the compatibility layer), typecode-requ
+iring function calls (
+\emph on
+e.g.
+
+\emph default
+ zeros, array) understand the old typecode characters.
+
+\newline
+The changes are (Numeric --> NumPy):
+\end_layout
+
+\begin_deeper
+\begin_layout Enumerate
+'b' --> 'B'
+\end_layout
+
+\begin_layout Enumerate
+'1' --> 'b'
+\end_layout
+
+\begin_layout Enumerate
+'s' --> 'h'
+\end_layout
+
+\begin_layout Enumerate
+'w' --> 'H'
+\end_layout
+
+\begin_layout Enumerate
+'u' --> 'I'
+\end_layout
+
+\end_deeper
+\begin_layout Enumerate
+
+\emph on
+arr.
+\emph default
+flat now returns an indexable 1-D iterator.
+ This behaves correctly when passed to a function, but if you expected methods
+ or attributes on
+\emph on
+arr.
+\emph default
+flat --- besides .copy() --- then you will need to replace
+\emph on
+arr
+\emph default
+.flat with
+\emph on
+arr.
+\emph default
+ravel() (copies only when necessary) or
+\emph on
+arr.
+\emph default
+flatten() (always copies).
+ The alter_code1 module will change
+\emph on
+arr
+\emph default
+.flat to
+\emph on
+arr
+\emph default
+.ravel() unless you used the construct
+\emph on
+arr
+\emph default
+.flat = obj or
+\emph on
+arr
+\emph default
+.flat[ind].
+\end_layout
+
+\begin_layout Enumerate
+If you used type-equality testing on the objects returned from arrays, then
+ you need to change this to isinstance testing.
+ Thus type(a[0]) is float or type(a[0]) == float should be changed to isinstance
+(a[0], float).
+ This is because array scalar objects are now returned from arrays.
+ These inherit from the Python scalars where they can, but define their
+ own methods and attributes.
+ This conversion is done by alter_code1 for the types (float, int, complex,
+ and ArrayType)
+\end_layout
+
+\begin_layout Enumerate
+If your code should produce 0-d arrays.
+ These no-longer have a length as they should be interpreted similarly to
+ real scalars which don't have a length.
+
+\end_layout
+
+\begin_layout Enumerate
+Arrays cannot be tested for truth value unless they are empty (returns False)
+ or have only one element.
+ This means that if Z: where Z is an array will fail (unless Z is empty
+ or has only one element).
+ Also the 'and' and 'or' operations (which test for object truth value)
+ will also fail on arrays of more than one element.
+ Use the .any() and .all() methods to test for truth value of an array.
+
+\end_layout
+
+\begin_layout Enumerate
+Masked arrays return a special nomask object instead of None when there
+ is no mask on the array for the functions getmask and attribute access
+
+\emph on
+arr
+\emph default
+.mask
+\end_layout
+
+\begin_layout Enumerate
+Masked array functions have a default axis of None (meaning ravel), make
+ sure to specify an axis if your masked arrays are larger than 1-d.
+
+\end_layout
+
+\begin_layout Enumerate
+If you used the construct
+\family typewriter
+arr.shape=<tuple>
+\family default
+, this will not work for array scalars (which can be returned from array
+ operations).
+ You cannot set the shape of an array-scalar (you can read it though).
+ As a result, for more general code you should use
+\family typewriter
+arr=arr.reshape(<tuple>)
+\family default
+ which works for both array-scalars and arrays.
+
+\end_layout
+
+\begin_layout Standard
+The alter_code1 script should handle the changes outlined in steps 1-5 above.
+ The final incompatibilities in 6-9 are less common and must be modified
+ by hand if necessary.
+
+\end_layout
+
+\begin_layout Subsection
+Second-step changes
+\end_layout
+
+\begin_layout Standard
+During the second phase of migration (should it be necessary) the compatibility
+ layer is dropped.
+ This phase requires additional changes to your code.
+ There is another conversion module (alter_code2) which can help but it
+ is not complete.
+ The changes required to drop dependency on the compatibility layer are
+\end_layout
+
+\begin_layout Enumerate
+Importing
+\end_layout
+
+\begin_deeper
+\begin_layout Enumerate
+numpy.oldnumeric --> numpy
+\end_layout
+
+\begin_layout Enumerate
+from numpy.oldnumeric import * --> from numpy import * (this may clobber
+ more names and therefore require further fixes to your code but then you
+ didn't do this regularly anyway did you).
+ The recommended procedure if this replacement causes problems is to fix
+ the use of from numpy.oldnumeric import * to extract only the required names
+ and then continue.
+\end_layout
+
+\begin_layout Enumerate
+numpy.oldnumeric.mlab --> None, the functions come from other places.
+\end_layout
+
+\begin_layout Enumerate
+numpy.oldnumeric.linear_algebra --> numpy.lilnalg with name changes to the
+ functions (made lower case and shorter).
+\end_layout
+
+\begin_layout Enumerate
+numpy.oldnumeric.random_array --> numpy.random with some name changes to the
+ functions.
+\end_layout
+
+\begin_layout Enumerate
+numpy.oldnumeic.fft --> numpy.fft with some name changes to the functions.
+\end_layout
+
+\begin_layout Enumerate
+numpy.oldnumeric.rng --> None
+\end_layout
+
+\begin_layout Enumerate
+numpy.oldnumeric.rng_stats --> None
+\end_layout
+
+\begin_layout Enumerate
+numpy.oldnumeric.user_array --> numpy.lib.user_array
+\end_layout
+
+\begin_layout Enumerate
+numpy.oldnumeric.matrix --> numpy
+\end_layout
+
+\end_deeper
+\begin_layout Enumerate
+The typecode names are all lower-case and refer to type-objects corresponding
+ to array scalars.
+ The character codes are understood by array-creation functions but are
+ not given names.
+ All named type constants should be replaced with their lower-case equivalents.
+ Also, the old character codes '1', 's', 'w', and 'u' are not understood
+ as data-types.
+ It is probably easiest to manually replace these with Int8, Int16, UInt16,
+ and UInt32 and let the alter_code2 script convert the names to lower-case
+ typeobjects.
+
+\end_layout
+
+\begin_layout Enumerate
+Keyword and argument changes
+\end_layout
+
+\begin_deeper
+\begin_layout Enumerate
+All
+\family typewriter
+typecode=
+\family default
+ keywords must be changed to
+\family typewriter
+dtype=
+\family default
+.
+
+\end_layout
+
+\begin_layout Enumerate
+The
+\family typewriter
+savespace
+\family default
+ keyword argument has been removed from all functions where it was present
+ (array, sarray, asarray, ones, and zeros).
+ The sarray function is equivalent to asarray.
+\end_layout
+
+\end_deeper
+\begin_layout Enumerate
+The default data-type in NumPy is float unlike in Numeric (and numpy.oldnumeric)
+ where it was int.
+ There are several functions affected by this so that if your code was relying
+ on the default data-type, then it must be changed to explicitly add dtype=int.
+\end_layout
+
+\begin_layout Enumerate
+The nonzero function in NumPy returns a tuple of index arrays just like
+ the corresponding method.
+ There is a flatnonzero function that first ravels the array and then returns
+ a single index array.
+ This function should be interchangeable with the old use of nonzero.
+
+\end_layout
+
+\begin_layout Enumerate
+The default axis is None (instead of 0) to match the methods for the functions
+ take, repeat, sum, average, product, sometrue, alltrue, cumsum, and cumproduct
+ (from Numeric) and also for the functions average, max, min, ptp, prod,
+ std, and mean (from MLab).
+\end_layout
+
+\begin_layout Enumerate
+The default axis is None (instead of -1) to match the methods for the functions
+ argmin, argmax, compress
+\end_layout
+
+\begin_layout Subsection
+Updating code that uses Numeric using alter_codeN
+\end_layout
+
+\begin_layout Standard
+Despite the long list of changes that might be needed given above, it is
+ likely that your code does not use any of the incompatible corners and
+ it should not be too difficult to convert from Numeric to NumPy.
+ For example all of SciPy was converted in about 2-3 days.
+ The needed changes are largely search-and replace type changes, and the
+ alter_codeN modules can help.
+ The modules have two functions which help the process:
+\end_layout
+
+\begin_layout Description
+convertfile (filename, orig=1)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Convert the file with the given filename to use NumPy.
+ If orig is True, then a backup is first made and given the name filename.orig.
+ Then, the file is converted and the updated code written over the top of
+ the old file.
+
+\end_layout
+
+\begin_layout Description
+convertall (direc=os.path.curdir, orig=1)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Converts all the
+\begin_inset Quotes eld
+\end_inset
+
+.py
+\begin_inset Quotes erd
+\end_inset
+
+ files in the given directory to use NumPy.
+ Backups of all the files are first made if orig is True as explained for
+ the convertfile function.
+
+\end_layout
+
+\begin_layout Description
+convertsrc (direc=os.path.curdir, ext=None, orig=1)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Replace
+\family typewriter
+''Numeric/arrayobject.h
+\begin_inset Quotes erd
+\end_inset
+
+
+\family default
+ with
+\family typewriter
+''numpy/oldnumeric.h
+\begin_inset Quotes erd
+\end_inset
+
+
+\family default
+ in all files ending in the list of extensions given by ext (if ext is None,
+ then all files are updated).
+ If orig is True, then first make a backup file with
+\begin_inset Quotes eld
+\end_inset
+
+.orig
+\begin_inset Quotes erd
+\end_inset
+
+ as the extension.
+\end_layout
+
+\begin_layout Description
+converttree (direc=os.path.curdir)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Walks the tree pointed to by direc and converts all
+\begin_inset Quotes eld
+\end_inset
+
+.py
+\begin_inset Quotes erd
+\end_inset
+
+ modules in each sub-directory to use NumPy.
+ No backups of the files are made.
+ Also, converts all .h and .c files to replace
+\family typewriter
+''Numeric/arrayobject.h
+\begin_inset Quotes erd
+\end_inset
+
+
+\family default
+ with
+\family typewriter
+''numpy/oldnumeric.h
+\begin_inset Quotes erd
+\end_inset
+
+
+\family default
+ so that NumPy is used.
+
+\end_layout
+
+\begin_layout Subsection
+Changes to think about
+\end_layout
+
+\begin_layout Standard
+Even if you don't make changes to your old code.
+ If you are used to coding in Numeric, then you may need to adjust your
+ coding style a bit.
+ This list provides some helpful things to remember.
+
+\end_layout
+
+\begin_layout Enumerate
+Switch from using typecode characters to bitwidth type names or c-type names
+
+\end_layout
+
+\begin_layout Enumerate
+Convert use of uppercase type-names Int32, Float, etc., to lower case int32,
+ float, etc.
+\end_layout
+
+\begin_layout Enumerate
+Convert use of functions to method calls where appropriate but explicitly
+ specify any axis arguments for arrays greater than 1-d.
+
+\end_layout
+
+\begin_layout Enumerate
+The names for standard computations like Fourier transforms, linear algebra,
+ and random-number generation have changed to conform to the standard of
+ lower-case names possibly separated by an underscore.
+\end_layout
+
+\begin_layout Enumerate
+Look for ways to take advantage of advanced slicing, but remember it always
+ returns a copy and may be slower at times.
+\end_layout
+
+\begin_layout Enumerate
+Remove any kludges you inserted to eliminate problems with Numeric that
+ are now gone.
+
+\end_layout
+
+\begin_layout Enumerate
+Look for ways to take advantage of new features like expanded data-types
+ (record-arrays).
+
+\end_layout
+
+\begin_layout Enumerate
+See if you can inherit from the ndarray directly, rather than using user_array.co
+ntainer (UserArray).
+ However, if you were using UserArray in a multiple-inheritance hierarchy
+ this is going to be more difficult and you can continue to use the standard
+ container class in user_array (but notice the name change).
+
+\end_layout
+
+\begin_layout Enumerate
+Watch your usage of scalars extracted from arrays.
+ Treating Numeric arrays like lists and then doing math on the elements
+ 1 by 1 was always about 2x slower than using real lists in Python.
+ This can now be 3x-6x slower than using lists in NumPy because of the increased
+ complexity of both the indexing of ndarrays and the math of array scalars.
+ If you must select individual scalars from NumPy, you can get some speed
+ increases by using the item method to get a standard Python scalar from
+ an N-d array and by using the itemset method to place a scalar into a particula
+r location in the N-d array.
+ This complicates the appearance of the code, however.
+ Also, when using these methods inside a loop, be sure to assign the methods
+ to a local variable to avoid the attribute look-up at each loop iteration.
+
+\end_layout
+
+\begin_layout Standard
+Throughout this book, warnings are inserted when compatibility issues with
+ old Numeric are raised.
+ While you may not need to make any changes to get code to run with the
+ ndarray object, you will likely want to make changes to take advantage
+ of the new features of NumPy.
+ If you get into a jam during the conversion process, you should be aware
+ that Numeric and NumPy can both be used together and they will not interfere
+ with each other.
+ In addition, if you have Numeric 24.0 or newer, they can even share the
+ same memory.
+ This makes it easy to use NumPy as well as third-party tools that have
+ not made the switch from Numeric yet.
+\end_layout
+
+\begin_layout Section
+Summary of differences with Numarray
+\end_layout
+
+\begin_layout Standard
+Conversion from Numarray can also be relatively painless, depending on how
+ dependent your code is on the specific structure of the Numarray ufuncs,
+ cfuncs, and various array-like objects.
+ The internals of Numarray can be quite different and so depending on how
+ intimately you used those internals adapting to NumPy can be more or less
+ difficult.
+ C-code that used the Numarray C-API can be easily adapted because NumPy
+ includes a Numarray-compatible C-API module.
+ All you need to do is replace usage of
+\begin_inset Quotes eld
+\end_inset
+
+numarray/libnumarray.h
+\begin_inset Quotes erd
+\end_inset
+
+ with
+\begin_inset Quotes eld
+\end_inset
+
+numpy/libnumarray.h
+\begin_inset Quotes erd
+\end_inset
+
+ and be sure the directory returned from the Python command numpy.get_numarray_in
+clude() is included in the list of directories used for compilation.
+\end_layout
+
+\begin_layout Standard
+On the Python-side the largest number of differences are in the methods
+ and attributes of the array and the way array data-types are represented.
+ In addition, arrays containing Python Objects, strings, and records are
+ an integral part of the array object and not handled using a separate class
+ (although enhanced separate classes do exist for the case of character
+ arrays and record arrays).
+
+\end_layout
+
+\begin_layout Standard
+As is the case with Numeric, there is a two-step process available for migrating
+ code written for Numarray to work with NumPy.
+ This process involves running functions in the modules alter_code1 and
+ alter_code2 located in the numarray sub-package of NumPy.
+ These modules have interfaces identical to the ones that convert Numeric
+ code, but they work to convert code written for numarray.
+ The first module will convert your code to use the numarray compatibility
+ module (numpy.numarray), while the second will try and help convert code
+ to move away from dependency on the compatibility module.
+ Because many users will probably be content to only use the first step,
+ the alter_code2 module for second-stage migration may not be as complete
+ as it otherwise could be.
+
+\end_layout
+
+\begin_layout Standard
+Also, the alter_code1 module is not guaranteed to convert every piece of
+ working numarray code to use NumPy.
+ If your code relied on the internal module structure of numarray or on
+ how the class hierarchy was laid out, then it will need to be changed manually
+ to run with NumPy.
+ Of course you can still use your code with Numarray installed side-by-side
+ and the two array objects should be able to exchange data without copying.
+
+\end_layout
+
+\begin_layout Subsection
+First-step changes
+\end_layout
+
+\begin_layout Standard
+The alter_code1 script makes the following import and attribute/method changes
+\end_layout
+
+\begin_layout Subsubsection
+Import changes
+\end_layout
+
+\begin_layout Itemize
+import numarray --> import numpy.numarray as numarray
+\end_layout
+
+\begin_layout Itemize
+import numarray.package --> import numpy.numarray.package as numarray_package
+ with all usages of numarray.package in the code replaced by numarray_package
+\end_layout
+
+\begin_layout Itemize
+import numarray as <name> --> import numpy.numarray s <name>
+\end_layout
+
+\begin_layout Itemize
+import numarray.package as <name> --> import numpy.numarray.package as <name>
+\end_layout
+
+\begin_layout Itemize
+from numarray import <names> --> from numpy.numarray import <names>
+\end_layout
+
+\begin_layout Itemize
+from numarray.package import <names> --> from numpy.numarray.package import
+ <names>
+\end_layout
+
+\begin_layout Subsubsection
+Attribute and method changes
+\end_layout
+
+\begin_layout Itemize
+.imaginary --> .imag
+\end_layout
+
+\begin_layout Itemize
+.flat --> probably .ravel() (Many usages will still work correctly because
+ you can index and assign to self.flat)
+\end_layout
+
+\begin_layout Itemize
+.byteswapped() --> .byteswap(False)
+\end_layout
+
+\begin_layout Itemize
+.byteswap() --> .byteswap(True) (Returns a reference to self instead of None).
+
+\end_layout
+
+\begin_layout Itemize
+self.info() --> numarray.info(self)
+\end_layout
+
+\begin_layout Itemize
+.isaligned() --> .flags.aligned
+\end_layout
+
+\begin_layout Itemize
+.isbyteswapped() --> not .dtype.isnative (the byte-order is a property of the
+ data-type object not the array itself in NumPy).
+
+\end_layout
+
+\begin_layout Itemize
+.iscontiguous() --> .flags.c_contiguous
+\end_layout
+
+\begin_layout Itemize
+.is_c_array() --> .dtype.isnative and .flags.carray
+\end_layout
+
+\begin_layout Itemize
+.is_fortran_contiguous() --> .flags.f_contiguous
+\end_layout
+
+\begin_layout Itemize
+.is_f_array() --> .dtype.isnative and .flags.farray
+\end_layout
+
+\begin_layout Itemize
+.itemsize() --> .itemsize
+\end_layout
+
+\begin_layout Itemize
+.nelements() --> .size
+\end_layout
+
+\begin_layout Itemize
+self.new(type) --> numarray.newobj(self, type)
+\end_layout
+
+\begin_layout Itemize
+.repeat(r) --> .repeat(r, axis=0)
+\end_layout
+
+\begin_layout Itemize
+.size() --> .size
+\end_layout
+
+\begin_layout Itemize
+.type() --> numarray.typefrom(self)
+\end_layout
+
+\begin_layout Itemize
+.typecode() --> .dtype.char
+\end_layout
+
+\begin_layout Itemize
+.stddev() --> .std()
+\end_layout
+
+\begin_layout Itemize
+.togglebyteorder() --> numarray.togglebyteorder(self)
+\end_layout
+
+\begin_layout Itemize
+.getshape() --> .shape
+\end_layout
+
+\begin_layout Itemize
+.setshape(obj) --> .shape = obj
+\end_layout
+
+\begin_layout Itemize
+.getflat() --> .ravel()
+\end_layout
+
+\begin_layout Itemize
+.getreal() --> .real
+\end_layout
+
+\begin_layout Itemize
+.setreal(obj) --> .real = obj
+\end_layout
+
+\begin_layout Itemize
+.getimag() --> .imag
+\end_layout
+
+\begin_layout Itemize
+.setimag(obj) --> .imag = obj
+\end_layout
+
+\begin_layout Itemize
+.getimaginary() --> .imag
+\end_layout
+
+\begin_layout Itemize
+.setimaginary(obj) --> .imag = obj
+\end_layout
+
+\begin_layout Subsection
+Second-step changes
+\end_layout
+
+\begin_layout Standard
+One of the notable differences is that several functions (array, arange,
+ fromfile, and fromstring) do not take the shape= keyword argument.
+ Instead you simply reshape the result using the reshape method.
+ Another notable difference is that instead of allowing typecode=, type=,
+ and dtype= variants for specifying the data-types, you must use the dtype=
+ keyword.
+ Other differences include
+\end_layout
+
+\begin_layout Itemize
+matrixmultiply(a,b) --> dot(a,b)
+\end_layout
+
+\begin_layout Itemize
+innerproduct(a,b) --> inner(a,b)
+\end_layout
+
+\begin_layout Itemize
+outerproduct(a,b) --> outer(a,b)
+\end_layout
+
+\begin_layout Itemize
+kroneckerproduct(a,b) --> kron(a,b)
+\end_layout
+
+\begin_layout Itemize
+tensormultiply(a,b) --> None
+\end_layout
+
+\begin_layout Subsection
+Additional Extension modules
+\end_layout
+
+\begin_layout Standard
+There are three extension packages that come included with numarray which
+ are now downloaded separately.
+ Stubs for these packages exist in numpy.numarray but they try and find the
+ actual code by looking at what is currently installed.
+ These packages are available in SciPy but can be installed separately as
+ well:
+\end_layout
+
+\begin_layout Itemize
+nd_image --> scipy.ndimage
+\end_layout
+
+\begin_layout Itemize
+convolve --> scipy.stsci.convolve
+\end_layout
+
+\begin_layout Itemize
+image --> scipy.stsci.image
+\end_layout
+
+\begin_layout Standard
+If you don't want to install all of scipy, you can grab just these packages
+ from SVN using
+\end_layout
+
+\begin_layout LyX-Code
+svn co http://svn.scipy.org/svn/scipy/trunk/Lib/ndimage ndimage
+\end_layout
+
+\begin_layout LyX-Code
+svn co http://svn.scipy.org/svn/scipy/trunk/Lib/stsci stsci
+\end_layout
+
+\begin_layout Standard
+and then run
+\end_layout
+
+\begin_layout LyX-Code
+cd ndimage; sudo python setup.py install
+\end_layout
+
+\begin_layout LyX-Code
+cd stsci; sudo python setup.py install
+\end_layout
+
+\begin_layout Standard
+On a Windows system, you can use the Tortoise SVN client which is integrated
+ into the Windows Explorer.
+ It can be downloaded from http://tortoisesvn.tigris.org.
+ Instructions on how to use it are also provided on that site.
+ After downloading the packages from SVN, installation will still require
+ a C-compiler (the mingw32 compiler works fine even with MSVC-compiled Python
+ as long as you specify --compiler=mingw32).
+ Alternatively you can download binary releases of scipy from http://www.scipy.org
+ to get the needed functionality or use the Enthon edition of Python.
+\end_layout
+
+\begin_layout Chapter
+The Array Object
+\end_layout
+
+\begin_layout Quotation
+Don't worry about people stealing your ideas.
+ If your ideas are any good, you'll have to ram them down people's throats.
+\end_layout
+
+\begin_layout Right Address
+---
+\emph on
+Howard Aiken, IBM engineer
+\end_layout
+
+\begin_layout Quotation
+No idea is so antiquated that it was not once modern; no idea is so modern
+ that it will not someday be antiquated.
+\end_layout
+
+\begin_layout Right Address
+---
+\emph on
+Ellen Glasgow
+\end_layout
+
+\begin_layout Section
+
+\family typewriter
+ndarray
+\family default
+ Attributes
+\end_layout
+
+\begin_layout Standard
+Array
+\begin_inset LatexCommand index
+name "ndarray|("
+
+\end_inset
+
+ attributes reflect information that is intrinsic to the array itself.
+ Generally, accessing an array through its attributes allows you to get
+ and sometimes set intrinsic properties of the array without creating a
+ new array.
+ The exposed attributes are the core parts of an array and only some of
+ them can be reset meaningfully without creating a new array.
+ Table
+\begin_inset LatexCommand ref
+reference "cap:ndarray-attributes"
+
+\end_inset
+
+ shows all the attributes
+\begin_inset LatexCommand index
+name "ndarray!attributes|("
+
+\end_inset
+
+ with a brief description.
+ Detailed information on each attribute is given below.
+\end_layout
+
+\begin_layout Warning
+Numeric Compatibility: you should check your old use of the .flat attribute.
+ This attribute now returns an iterator object which acts like a 1-d array
+ in terms of indexing.
+ while it does not share all the attributes or methods of an array, it will
+ be interpreted as an array in functions that take objects and convert them
+ to arrays.
+ Furthermore, Any changes in an array converted from a 1-d iterator will
+ be reflected back in the original array when the converted array is deleted.
+
+\end_layout
+
+\begin_layout Standard
+\begin_inset Float table
+wide false
+sideways false
+status open
+
+\begin_layout Standard
+\begin_inset Caption
+
+\begin_layout Standard
+\begin_inset LatexCommand label
+name "cap:ndarray-attributes"
+
+\end_inset
+
+Attributes of the
+\family typewriter
+ndarray
+\family default
+.
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+\begin_inset ERT
+status collapsed
+
+\begin_layout Standard
+
+
+\backslash
+vspace*{-0.2in}
+\backslash
+setlength{
+\backslash
+extrarowheight}{0.25eM}
+\end_layout
+
+\begin_layout Standard
+
+\end_layout
+
+\begin_layout Standard
+
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+\align center
+\begin_inset Tabular
+<lyxtabular version="3" rows="18" columns="3">
+<features>
+<column alignment="center" valignment="top" leftline="true" width="1in">
+<column alignment="center" valignment="top" leftline="true" width="1in">
+<column alignment="block" valignment="top" leftline="true" rightline="true" width="3in">
+<row topline="true" bottomline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\family sans
+\series bold
+\size large
+Attribute
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\family sans
+\series bold
+\size large
+Settable
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\family sans
+\series bold
+\size large
+Description
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\series bold
+flags
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+No
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+special array-connected dictionary-like object with attributes showing the
+ state of flags in this array; only the flags WRITEABLE, ALIGNED, and UPDATEIFCO
+PY can be modified by setting attributes of this object
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\series bold
+shape
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+Yes
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+tuple showing the array shape; setting this attribute re-shapes the array
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\series bold
+strides
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+Yes
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+tuple showing how many
+\emph on
+bytes
+\emph default
+ must be jumped in the data segment to get from one entry to the next
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\series bold
+ndim
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+No
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+number of dimensions in array
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\series bold
+data
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+Yes
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+buffer object loosely wrapping the array data (only works for single-segment
+ arrays)
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\series bold
+size
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+No
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+total number of elements
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\series bold
+itemsize
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+No
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+size (in bytes) of each element
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\series bold
+nbytes
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+No
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+total number of bytes used
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\series bold
+base
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+No
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+object this array is using for its data buffer, or None if it owns its own
+ memory
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\series bold
+dtype
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+Yes
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+data-type object for this array
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\series bold
+real
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+Yes
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+real part of the array; setting copies data to real part of current array
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\series bold
+imag
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+Yes
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+imaginary part, or read-only zero array if type is not complex; setting
+ works only if type is complex
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\series bold
+flat
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+Yes
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+one-dimensional, indexable iterator object that acts somewhat like a 1-d
+ array
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\series bold
+ctypes
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+No
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+object to simplify the interaction of this array with the ctypes module
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\series bold
+__array_interface__
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+No
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+dictionary with keys (data, typestr, descr, shape, strides) for compliance
+ with Python side of array protocol
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\series bold
+__array_struct__
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+No
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+array interface on C-level
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true" bottomline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\series bold
+__array_priority__
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+No
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+always 0.0 for base type
+\family typewriter
+ndarray
+\end_layout
+
+\end_inset
+</cell>
+</row>
+</lyxtabular>
+
+\end_inset
+
+
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Subsection
+Memory Layout attributes
+\end_layout
+
+\begin_layout Description
+flags
+\begin_inset LatexCommand index
+name "ndarray!attributes!flags"
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Array flags
+\begin_inset LatexCommand index
+name "ndarray!flags|("
+
+\end_inset
+
+ provide information about how the memory area used for the array is to
+ be interpreted.
+ There are 6 Boolean flags in use which govern whether or not:
+\end_layout
+
+\begin_deeper
+\begin_layout Description
+C_CONTIGUOUS\InsetSpace ~
+(C) the data is in a single, C-style contiguous segment;
+\end_layout
+
+\begin_layout Description
+F_CONTIGUOUS\InsetSpace ~
+(F) the data is in a single, Fortran-style contiguous segment;
+\end_layout
+
+\begin_layout Description
+OWNDATA\InsetSpace ~
+(O) the array owns the memory it uses or if it borrows it from another
+ object (if this is False, the base attribute retrieves a reference to the
+ object this array obtained its data from);
+\end_layout
+
+\begin_layout Description
+WRITEABLE\InsetSpace ~
+(W) the data area can be written to;
+\end_layout
+
+\begin_layout Description
+ALIGNED\InsetSpace ~
+(A) the data and strides are aligned appropriately for the hardware
+ (as determined by the compiler);
+\end_layout
+
+\begin_layout Description
+UPDATEIFCOPY\InsetSpace ~
+(U) this array is a copy of some other array (referenced by
+
+\family typewriter
+.base
+\family default
+).
+ When this array is deallocated, the base array will be updated with the
+ contents of this array.
+\end_layout
+
+\end_deeper
+\begin_layout Description
+\InsetSpace ~
+ Only the
+\series bold
+UPDATEIFCOPY
+\series default
+,
+\series bold
+WRITEABLE
+\series default
+, and
+\series bold
+ALIGNED
+\series default
+ flags can be changed by the user.
+ This can be done using the special array-connected, dictionary-like object
+ that the flags attribute returns.
+ By setting elements in this dictionary, the underlying array obect's flags
+ are altered.
+ Flags can also be changed using the method
+\family typewriter
+setflags
+\family default
+(...).
+ All flags in the dictionary can be accessed using their first (upper case)
+ letter as well as the full name.
+
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Certain logical combinations of flags can also be read using named keys
+ to the special flags dictionary.
+ These combinations are
+\end_layout
+
+\begin_deeper
+\begin_layout Description
+FNC Returns F_CONTIGUOUS and not C_CONTIGUOUS
+\end_layout
+
+\begin_layout Description
+FORC Returns F_CONTIGUOUS or C_CONTIGUOUS (one-segment test).
+\end_layout
+
+\begin_layout Description
+BEHAVED\InsetSpace ~
+(B) Returns ALIGNED and WRITEABLE
+\end_layout
+
+\begin_layout Description
+CARRAY\InsetSpace ~
+(CA) Returns BEHAVED and C_CONTIGUOUS
+\end_layout
+
+\begin_layout Description
+FARRAY_(FA) Returns BEHAVED and F_CONTIGUOUS and not C_CONTIGUOUS
+\end_layout
+
+\end_deeper
+\begin_layout Note
+The array flags cannot be set arbitrarily.
+ UPDATEIFCOPY can only be set False.
+ the ALIGNED flag can only be set True if the data is truly aligned.
+ The flag WRITEABLE can only be set True if the array owns its own memory
+ or the ultimate owner of the memory exposes a writeable buffer interface
+ (or is a string).
+ The exception for string is made so that unpickling can be done without
+ copying memory.
+
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Flags can also be set and read using attribute access with the lower-case
+ key equivalent (without first letter support).
+ Thus, for example, self.flags.c_contiguous returns whether or not the array
+ is C-style contiguous, and self.flags.writeable=True changes the array to
+ be writeable (if possible)
+\begin_inset LatexCommand index
+name "ndarray!flags|)"
+
+\end_inset
+
+.
+\end_layout
+
+\begin_layout Description
+shape
+\begin_inset LatexCommand index
+name "ndarray!attributes!shape"
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ The shape of the array is a tuple giving the number of elements in each
+ dimension.
+ The shape can be reset for single-segment arrays by setting this attribute
+ to another tuple.
+ The total number of elements cannot change.
+ However, a -1 may be used in a dimension entry to indicate that the array
+ length in that dimension should be computed so that the total number of
+ elements does not change.
+
+\family typewriter
+a.shape=x
+\family default
+ is equivalent to
+\family typewriter
+a=a.reshape(x)
+\family default
+ except the latter can be used even if the array is not single-segment and
+ even if
+\begin_inset Formula $a$
+\end_inset
+
+ is an array scalar.
+
+\end_layout
+
+\begin_layout Note
+Setting the shape attribute to () for a 1-element array will turn self into
+ a 0-dimensional array.
+ This is one of the few ways to get a 0-dimensional array in Python.
+ Most other operations will return an array scalar.
+ Other ways to get a 0-dimensional array in Python include calling array
+ with a scalar argument and calling the squeeze method of an array whose
+ shape is all 1's.
+
+\end_layout
+
+\begin_layout Description
+strides
+\begin_inset LatexCommand index
+name "ndarray!attributes!strides"
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ The strides of an array is a tuple showing for each dimension how many
+
+\emph on
+bytes
+\emph default
+ must be skipped to get to the next element in that dimension.
+ Setting this attribute to another tuple will change the way the memory
+ is viewed.
+ This attribute can only be set to a tuple that will not cause the array
+ to access unavailable memory.
+ If an attempt is made to do so, ValueError is raised.
+\end_layout
+
+\begin_layout Description
+ndim
+\begin_inset LatexCommand index
+name "ndarray!attributes!ndim"
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ The number of dimensions of an array is sometimes called the rank of the
+ array.
+ Getting this attribute reveals the length of the shape tuple and the strides
+ tuple.
+
+\end_layout
+
+\begin_layout Description
+data
+\begin_inset LatexCommand index
+name "ndarray!attributes!data"
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ A buffer object referencing the actual data for this array if this array
+ is single-segment.
+ If the array is not single-segment, then an AttributeError is raised.
+ The buffer object is writeable depending on the status of self.flags.writeable.
+\end_layout
+
+\begin_layout Description
+size
+\begin_inset LatexCommand index
+name "ndarray!attributes!size"
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ The total number of elements in the array.
+\end_layout
+
+\begin_layout Description
+itemsize
+\begin_inset LatexCommand index
+name "ndarray!attributes!itemsize"
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ The number of bytes each element of the array requires.
+
+\end_layout
+
+\begin_layout Description
+nbytes
+\begin_inset LatexCommand index
+name "ndarray!attributes!nbytes"
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ The total number of bytes used by the array.
+ This is equal to
+\family typewriter
+self.itemsize*self.size
+\family default
+.
+\end_layout
+
+\begin_layout Description
+base
+\begin_inset LatexCommand index
+name "ndarray!attributes!base"
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ If the array does not own its own memory, then this attribute returns the
+ object whose memory this array is referencing.
+ The returned object may not be the original allocator of the memory, but
+ may be borrowing it from still another object.
+ If this array does own its own memory, then None is returned unless the
+ UPDATEIFCOPY flag is True in which case self.base is the array that will
+ be updated when self is deleted.
+ UPDATEIFCOPY gets set for an array that is created as a behaved copy of
+ a general array.
+ The intent is for the misaligned array to get any changes that occur to
+ the copy.
+
+\end_layout
+
+\begin_layout Subsection
+Data Type attributes
+\end_layout
+
+\begin_layout Standard
+There are several ways to specify the kind of data that the array is composed
+ of.
+ The fullest description that preserves field information is always obtained
+ using an actual dtype object.
+ See Chapter
+\begin_inset LatexCommand ref
+reference "cha:Data-descriptor-objects"
+
+\end_inset
+
+ for more discussion on data-type objects and acceptable arguments to construct
+ data-type objects.
+ Three commonly-used attributes of the data-type object returned are also
+ documented here.
+\end_layout
+
+\begin_layout Description
+dtype
+\begin_inset LatexCommand index
+name "ndarray!attributes!dtype"
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ A data-type object that fully describes (including any defined fields)
+ each fixed-length item in the array.
+ Whether or not the data is in machine byte-order is also determined by
+ the data-type.
+ The data-type attribute can be set to anything that can be interpreted
+ as a data-type (see Chapter
+\begin_inset LatexCommand ref
+reference "cha:Data-descriptor-objects"
+
+\end_inset
+
+ for more information).
+ Setting this attribute allows you to change the interpretation of the data
+ in the array.
+ The new data-type must be compatible with the array's current data-type.
+ The new data-type is compatible if it has the same itemsize as the current
+ data-type descriptor, or (if the array is a single-segment array) if the
+ the array with the new data-type fits in the memory already consumed by
+ the array.
+
+\end_layout
+
+\begin_layout Description
+dtype.type
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ A Python type object gives the typeobject whose instances represent elements
+ of the array.
+ This type object can be used to instantiate a scalar of that type.
+
+\end_layout
+
+\begin_layout Description
+dtype.char
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ A typecode character unique to each of the 21 built-in types.
+
+\end_layout
+
+\begin_layout Description
+dtype.str
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ This string consists of a required first character giving the
+\begin_inset Quotes eld
+\end_inset
+
+endianness
+\begin_inset Quotes erd
+\end_inset
+
+ of the data (
+\begin_inset Quotes eld
+\end_inset
+
+<
+\begin_inset Quotes erd
+\end_inset
+
+ for little endian,
+\begin_inset Quotes eld
+\end_inset
+
+>
+\begin_inset Quotes erd
+\end_inset
+
+ for big endian, and
+\begin_inset Quotes eld
+\end_inset
+
+|
+\begin_inset Quotes erd
+\end_inset
+
+ for irrelevant), the second character is a code for the kind of data ('b'
+ for Boolean, 'i' for signed integer, 'u' for unsigned integer, 'f' for
+ floating-point, 'c' for complex floating point, 'O' for object, 'S' for
+ ASCII string, 'U' for unicode, and 'V' for void), the final characters
+ give the number of bytes each element uses.
+\end_layout
+
+\begin_layout Subsection
+Other attributes
+\end_layout
+
+\begin_layout Description
+T
+\begin_inset LatexCommand index
+name "ndarray!attributes!T"
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Equivalent to self.transpose().
+ For self.ndim < 2, it returns a view of self.
+
+\end_layout
+
+\begin_layout Warning
+If arr is 0- or 1-dimensional, then arr.T will return a new ndarray which
+ refers to the same data as arr.
+ This is because transpose has the effect of reversing the shape attribute
+ of an array (whose 0-d and 1-d equivalent is to return the same array).
+ This may be surprising if you are thinking of your 1-d array as a
+\begin_inset Quotes eld
+\end_inset
+
+row
+\begin_inset Quotes erd
+\end_inset
+
+ or a
+\begin_inset Quotes eld
+\end_inset
+
+column
+\begin_inset Quotes erd
+\end_inset
+
+ vector and expected the .T attribute to return the other convention.
+
+\end_layout
+
+\begin_layout Description
+real
+\begin_inset LatexCommand index
+name "ndarray!attributes!real"
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ The real part of an array.
+ For arrays that are not complex this attribute returns the array itself.
+ Setting this attribute allows setting just the real part of an array.
+ If the array is already real then setting this attribute is equivalent
+ to self[...] = values.
+\end_layout
+
+\begin_layout Description
+imag
+\begin_inset LatexCommand index
+name "ndarray!attributes!imag"
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ A view of the imaginary part of an array.
+ For arrays that are not complex, this returns a read-only array of zeros.
+ Setting this array allows in-place alteration of the complex part of an
+ imaginary array.
+ If the array is not complex, then trying to set this attribute raises an
+ Error.
+
+\end_layout
+
+\begin_layout Description
+flat
+\begin_inset LatexCommand index
+name "ndarray!attributes!flat"
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Return an iterator object (numpy.flatiter) that acts like a 1-d version
+ of the array.
+ 1-d indexing works on this array and it can be passed in to most routines
+ as an array wherein a 1-d array will be constructed from it.
+ The new 1-d array will reference this array's data if this array is C-style
+ contiguous, otherwise, new memory will be allocated for the 1-d array,
+ the UPDATEIFCOPY flag will be set for the new array, and this array will
+ have its WRITEABLE flag set FALSE until the the last reference to the new
+ array disappears.
+ When the last reference to the new 1-d array disappears, the data will
+ be copied over to this non-contiguous array.
+ This is done so that a.flat effectively references the current array regardless
+ of whether or not it is contiguous or non-contiguous.
+ As an example, consider the following code:
+\end_layout
+
+\begin_layout MyCode
+>>> a = zeros((4,5))
+\newline
+>>> b = ones(6)
+\newline
+>>> add(b,b,a[1:3,0:3].flat)
+\newline
+array([[ 2.,
+ 2., 2.],
+\newline
+ [ 2., 2., 2.]])
+\newline
+>>> print a
+\newline
+[[ 0.
+ 0.
+ 0.
+ 0.
+ 0.]
+\newline
+ [ 2.
+ 2.
+ 2.
+ 0.
+ 0.]
+\newline
+ [ 2.
+ 2.
+ 2.
+ 0.
+ 0.]
+\newline
+ [ 0.
+ 0.
+ 0.
+ 0.
+ 0.]]
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ The numpy.flatiter object has two methods:
+\series bold
+__array__()
+\series default
+ and
+\series bold
+copy()
+\series default
+ and one attribute:
+\series bold
+base
+\series default
+.
+ The base attribute returns a reference to the underlying array.
+
+\end_layout
+
+\begin_layout Description
+__array_priority__
+\begin_inset LatexCommand index
+name "ndarray!attributes!\\_\\_array\\_priority\\_\\_"
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ The array priority attribute is a floating point number useful in mixed
+ operations involving two subtypes to decide which subtype is returned.
+ The base ndarray object has priority 0.0 and 1.0 is the default subtype priority.
+\end_layout
+
+\begin_layout Subsection
+Array Interface attributes
+\end_layout
+
+\begin_layout Standard
+The array interface
+\begin_inset LatexCommand index
+name "array interface"
+
+\end_inset
+
+ (sometimes called array protocol) was created in 2005 as a means for array-like
+ Python objects to re-use each other's data buffers intelligently whenever
+ possible.
+ The ndarray object supports both the Python-side and the C-side of the
+ array interface.
+ The system is able to consume objects that expose the array interface,
+ and array objects can expose their inner workings to other objects that
+ support the array interface.
+
+\end_layout
+
+\begin_layout Description
+__array_interface__
+\begin_inset LatexCommand index
+name "ndarray!attributes!\\_\\_array\\_interface\\_\\_"
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ The python-side of the array interface.
+ It is a dictionary with the following attributes:
+\end_layout
+
+\begin_deeper
+\begin_layout Description
+data A 2-tuple (dataptr, read-only flag).
+ The dataptr is a string giving the address (in hexadecimal format) of the
+ array data.
+ The read-only flag is True if the array memory is read-only.
+
+\end_layout
+
+\begin_layout Description
+strides The strides tuple.
+ Same as
+\series bold
+strides
+\series default
+ attribute except None is returned if the array is C-style contiguous.
+\end_layout
+
+\begin_layout Description
+shape The shape tuple.
+ Same as
+\series bold
+shape
+\series default
+ attribute.
+\end_layout
+
+\begin_layout Description
+typestr A string giving the format of the data.
+ Same as
+\series bold
+dtype.str
+\series default
+ attribute.
+
+\end_layout
+
+\begin_layout Description
+descr A list of tuples providing the detailed description of this data type.
+ This information is obtained from the arrdescr attribute of the dtypedescr
+ object associated with each array.
+ For arrays with fields, this will return a valid array-protocol descriptor
+ list.
+ For arrays without defined fields, this returns [('',typestr)].
+\end_layout
+
+\end_deeper
+\begin_layout Description
+__array_struct__
+\begin_inset LatexCommand index
+name "ndarray!attributes!\\_\\_array\\_struct\\_\\_"
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ A PyCObject that wraps a pointer to a PyArrayInterface structure.
+ This is only useful on the C-level for rapid implementation of the array
+ interface, using a single attribute lookup.
+\end_layout
+
+\begin_layout Description
+ctypes
+\begin_inset LatexCommand index
+name "ndarray!attributes!ctypes|("
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ This attribute creates an object that makes it easier to use arrays when
+ calling out to shared libraries with the ctypes module.
+ The returned object has data, shape, and strides attributes which return
+ ctypes
+\begin_inset LatexCommand index
+name "ctypes"
+
+\end_inset
+
+ objects that can be used as arguments to a shared library.
+ These attributes are:
+\end_layout
+
+\begin_deeper
+\begin_layout Description
+data A pointer to the memory area of the array as a Python integer.
+ This memory area may contain data that is not aligned, or not in correct
+ byte-order.
+ The memory area may not even be writeable.
+ The array flags and data-type of this array should be respected when passing
+ this attribute to arbitrary C-code to avoid trouble that can include Python
+ crashing.
+ User Beware! The value of this attribute is exactly the same as
+\family typewriter
+self.__array_interface__['data'][0]
+\family default
+.
+\end_layout
+
+\begin_layout Description
+shape (c_intp*self.ndim) A ctypes array of length self.ndim where the base-type
+ is the C-integer corresponding to dtype('p') on this platform.
+ This base-type could be c_int, c_long, or c_longlong depending on the platform.
+ The c_intp type is defined accordingly in numpy.ctypeslib.
+ The ctypes array contains the shape of the underlying array.
+\end_layout
+
+\begin_layout Description
+strides (c_intp*self.ndim) A ctypes array of length self.ndim where the base-type
+ is the same as for the shape attribute.
+ This ctypes array contains the strides information from the underlying
+ array.
+ This strides information is important for showing how many bytes must be
+ jumped to get to the next element in the array.
+
+\end_layout
+
+\begin_layout Description
+_as_parameter_ (c_void_p) Returns the data-pointer to the array as a ctypes
+ object.
+ Among other possible uses, this enables this ctypes object to be used directly
+ in a ctypes-loaded call to an arbitrary function.
+ Be sure to respect the flags on the array and the size and strides of the
+ array so as not to use this memory in-appropriately (see the
+\series bold
+ndpointer
+\series default
+ function for how to return a class that can be used with the argtypes attribute
+ of ctypes functions).
+
+\end_layout
+
+\end_deeper
+\begin_layout Warning
+Be careful using the ctypes attribute --- especially on temporary arrays
+ or arrays constructed on the fly.
+ For example, calling (a+b).ctypes.data_as(ctypes.c_void_p) returns a pointer
+ to memory that is invalid because the array created as (a+b) is deallocated
+ before the next Python statement.
+ You can avoid this problem using either c=a+b or ct=(a+b).ctypes.
+ In the latter case, ct will hold a reference to the array until ct is deleted
+ or re-assigned.
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ The ctypes object also has several methods which can alter how the shape,
+ strides, and data of the underlying object is returned.
+
+\end_layout
+
+\begin_deeper
+\begin_layout Description
+data_as (obj) Return the data pointer cast-to a particular c-types object.
+ For example, calling
+\family typewriter
+self._as_parameter_
+\family default
+ is equivalent to
+\family typewriter
+self.data_as(ctypes.c_void_p)
+\family default
+.
+ Perhaps you want to use the data as a pointer to a ctypes array of floating-poi
+nt data:
+\family typewriter
+self.data_as(ctypes.POINTER(ctypes.c_double))
+\family default
+.
+
+\end_layout
+
+\begin_layout Description
+shape_as (obj) Return the shape tuple as an array of some other c-types
+ type.
+ For example:
+\family typewriter
+self.shape_as(ctypes.c_short)
+\family default
+.
+
+\end_layout
+
+\begin_layout Description
+strides_as (obj) Return the strides tuple as an array of some other c-types
+ type.
+ For example:
+\family typewriter
+self.strides_as(ctypes.c_longlong)
+\family default
+.
+\end_layout
+
+\end_deeper
+\begin_layout Description
+\InsetSpace ~
+ If the ctypes module is not available, then the ctypes attribute of array
+ objects still returns something useful, but ctypes objects are not returned
+ and errors may be raised instead.
+ In particular, the object will still have the _as_parameter_ attribute
+ which will return an integer equal to the data
+\begin_inset LatexCommand index
+name "ndarray!attributes!ctypes|)"
+
+\end_inset
+
+ attribute
+\begin_inset LatexCommand index
+name "ndarray!attributes|)"
+
+\end_inset
+
+.
+
+\end_layout
+
+\begin_layout Section
+
+\family typewriter
+ndarray
+\family default
+ Methods
+\end_layout
+
+\begin_layout Standard
+In NumPy, the
+\family typewriter
+ndarray
+\family default
+ object has many methods
+\begin_inset LatexCommand index
+name "ndarray!methods|("
+
+\end_inset
+
+ which operate on or with the array in some fashion, typically returning
+ an array result.
+ In Numeric, many of these methods were only library calls.
+ These methods are explained in this chapter.
+ Whenever the array whose method is being called needs to be referenced
+ it will be referred to as
+\emph on
+this array
+\emph default
+, or
+\emph on
+self
+\emph default
+.
+ Keyword arguments will be shown.
+ Methods that only take one argument do not have keyword arguments.
+ Default values for one argument methods will be shown in braces {default}.
+
+\end_layout
+
+\begin_layout Warning
+If you are converting code from Numeric, then you will need to make the
+ following (search and replace) conversions:
+\family typewriter
+.typecode() --> .dtype.char
+\family default
+;
+\family typewriter
+.iscontiguous() --> .flags.contiguous
+\family default
+;
+\family typewriter
+.byteswapped() --> .byteswap()
+\family default
+;
+\family typewriter
+.toscalar() --> .item()
+\family default
+; and
+\family typewriter
+.itemsize() --> .itemsize
+\family default
+.
+ The numpy.oldnumeric.alter_code1 module can automate this for you.
+\end_layout
+
+\begin_layout Subsection
+Array conversion
+\end_layout
+
+\begin_layout Description
+tolist
+\begin_inset LatexCommand index
+name "ndarray!methods!tolist"
+
+\end_inset
+
+ ()
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ The contents of self as a nested list.
+\end_layout
+
+\begin_layout MyCode
+>>> a = array([[1,2,3],[4,5,6]]); print a.tolist()
+\newline
+[[1, 2, 3], [4, 5, 6]]
+\end_layout
+
+\begin_layout Description
+item
+\begin_inset LatexCommand index
+name "ndarray!methods!item"
+
+\end_inset
+
+ (*args)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ If no arguments are passed in, then this method only works for arrays with
+ one element (a.size == 1).
+ In this case, it returns a standard Python scalar object (if possible)
+ copied from the first element of self.
+ When the data type of self is longdouble or clongdouble, this returns a
+ scalar array object because there is no available Python scalar that would
+ not lose information.
+ Void arrays return a buffer object for item() unless fields are defined
+ in which case a tuple is returned.
+\end_layout
+
+\begin_layout MyCode
+>>> asc = a[0,0].item()
+\newline
+>>> type(asc)
+\newline
+<type 'int'>
+\newline
+>>> asc
+\newline
+1
+\newline
+>>> type(a[0,0])
+\newline
+<type
+ 'numpy.int32'>
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ If arguments are provided, then they indicate indices into the array (either
+ a flat index or an nd-index).
+ A standard Python scalar corresponding to the item at the given location
+ is then returned.
+ This is very similar to self[args] except instead of an array scalar, a
+ standard Python scalar is returned.
+ This can be useful for speeding up access to elements of the array and
+ doing arithmetic on elements of the array using Python's optimized math.
+
+\end_layout
+
+\begin_layout Description
+itemset
+\begin_inset LatexCommand index
+name "ndarray!methods!itemset"
+
+\end_inset
+
+ (*args)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ There must be at least 1 argument and define the last argument as item.
+ Then, this is equivalent to but faster than self[args] = item.
+ The item should be a scalar value and args must select a single item in
+ the array.
+\end_layout
+
+\begin_layout Description
+tostring
+\begin_inset LatexCommand index
+name "ndarray!methods!tostring"
+
+\end_inset
+
+ (order='C')
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ A Python string showing a copy of the raw contents of data memory.
+ The string can be produced in either 'C' or 'Fortran', or 'Any' order (the
+ default is 'C'-order).
+ 'Any' order means C-order unless the F_CONTIGUOUS flag in the array is
+ set, then 'Fortran' order.
+
+\end_layout
+
+\begin_layout Description
+tofile
+\begin_inset LatexCommand index
+name "ndarray!methods!tofile"
+
+\end_inset
+
+ (file=, sep='', format='')
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Write the contents of self to the open file object.
+ If file is a string, then open a file of that name first.
+ If sep is the empty string, then write the file in binary mode.
+ If sep is any other string, write the array in simple text mode separating
+ each element with the value of the sep string.
+ When the file is written in text mode, the format string can be used to
+ alter the appearance of each entry.
+ If format is the empty string, then it is equivalent to
+\family typewriter
+
+\begin_inset Quotes eld
+\end_inset
+
+%s
+\begin_inset Quotes erd
+\end_inset
+
+
+\family default
+.
+ Each element of the array will be converted to a Python scalar,
+\family typewriter
+o
+\family default
+, and written to the file as
+\family typewriter
+
+\begin_inset Quotes eld
+\end_inset
+
+format
+\begin_inset Quotes erd
+\end_inset
+
+ % o
+\family default
+.
+ Note that writing an array to a file does not store any information about
+ the shape, type, or endianness of an array.
+ When written in binary mode, tofile is functionally equivalent to
+\family typewriter
+fid.write(self.tostring())
+\family default
+.
+\end_layout
+
+\begin_layout MyCode
+>>> a.tofile('myfile.txt',sep=':',format='%03d')
+\end_layout
+
+\begin_layout MyCode
+Contents of myfile.txt
+\end_layout
+
+\begin_layout MyCode
+001:002:003:004:005:006
+\end_layout
+
+\begin_layout Description
+dump
+\begin_inset LatexCommand index
+name "ndarray!methods!dump"
+
+\end_inset
+
+ (file)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Pickle the contents of self to the file object represented by file.
+ Equivalent to cPickle.dump(self, file, 2)
+\end_layout
+
+\begin_layout Description
+dumps
+\begin_inset LatexCommand index
+name "ndarray!methods!dumps"
+
+\end_inset
+
+ ()
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Return pickled representation of self as a string.
+ Equivalent to cPickle.dumps(self, 2)
+\end_layout
+
+\begin_layout Description
+astype
+\begin_inset LatexCommand index
+name "ndarray!methods!astype"
+
+\end_inset
+
+ ({None})
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Force conversion of this array to an array with the data type provided
+ as the argument.
+ If the argument is None, or equal to the data type of self, then return
+ a copy of the array.
+
+\end_layout
+
+\begin_layout Description
+byteswap
+\begin_inset LatexCommand index
+name "ndarray!methods!byteswap"
+
+\end_inset
+
+ ({False})
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Byteswap the elements of the array and return the byteswapped array.
+ If the argument is True, then byteswap in-place and return a reference
+ to self.
+ Otherwise, return a copy of the array with the elements byteswapped.
+ The data-type descriptor is not changed so the array will have changed
+ numbers.
+\end_layout
+
+\begin_layout Description
+copy
+\begin_inset LatexCommand index
+name "ndarray!methods!copy"
+
+\end_inset
+
+ ()
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Return a copy of the array (which is always single-segment, and ALIGNED).
+ However, the data-type is preserved (including whether or not the data
+ is byteswapped).
+
+\end_layout
+
+\begin_layout Description
+view
+\begin_inset LatexCommand index
+name "ndarray!methods!view"
+
+\end_inset
+
+ ({None})
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Return a new array using the same memory area as self.
+ If the optional argument is given, it can be either a typeobject that is
+ a sub-type of the ndarray or an object that can be converted to a data-type
+ descriptor.
+ If the argument is a typeobject then a new array of that Python type is
+ returned that uses the information from self.
+ If the argument is a data-type descriptor, then a new array of the same
+ Python type as self is returned using the given data-type.
+
+\end_layout
+
+\begin_layout MyCode
+>>> print a.view(single)
+\newline
+[[ 1.40129846e-45 2.80259693e-45 4.20389539e-45]
+\newline
+
+ [ 5.60519386e-45 7.00649232e-45 8.40779079e-45]]
+\newline
+>>> a.view(ubyte)
+\newline
+array([[1,
+ 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0],
+\newline
+ [4, 0, 0, 0, 5, 0, 0, 0, 6, 0,
+ 0, 0]], dtype=uint8)
+\end_layout
+
+\begin_layout Description
+getfield
+\begin_inset LatexCommand index
+name "ndarray!methods!getfield"
+
+\end_inset
+
+ (dtype=, offset=0)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Return a
+\emph on
+field
+\emph default
+ of the given array as an array of the given data type.
+ A field is a view of the array's data at a certain byte offset interpreted
+ as a given data type.
+ The returned array is a reference into self, therefore changes made to
+ the returned array will be reflected in self.
+ This method is particularly useful for record arrays that use a void data
+ type, but it can also be used to extract the low (high)-order bytes of
+ other array types as well.
+ For example, using getfield, you could extract fixed-length substrings
+ from an array of strings.
+
+\end_layout
+
+\begin_layout MyCode
+>>> a = array(['Hello','World','NumPy'])
+\newline
+>>> a.getfield('S2',1)
+\newline
+array(['el',
+ 'or', 'um'],
+\newline
+ dtype='|S2')
+\end_layout
+
+\begin_layout Description
+setflags
+\begin_inset LatexCommand index
+name "ndarray!methods!setflags"
+
+\end_inset
+
+ (write=None, align=None, uic=None)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Set array flags WRITEABLE, ALIGNED, and UPDATEIFCOPY, respectively.
+ The ALIGNED flag can only be set to True if the data is actually aligned
+ according to the type.
+ The UPDATEIFCOPY flag can never be set to True.
+ The flag WRITEABLE can only be set True if the array owns its own memory
+ or the ultimate owner of the memory exposes a writeable buffer interface
+ (or is a string).
+ The exception for string is made so that unpickling can be done without
+ copying memory.
+
+\end_layout
+
+\begin_layout Description
+fill
+\begin_inset LatexCommand index
+name "ndarray!methods!fill"
+
+\end_inset
+
+ (scalar)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Fill an array with the scalar value (appropriately converted to the type
+ of self).
+ If the scalar value is an array or a sequence, then only the first element
+ is used.
+ This method is usually faster than a[...]=scalar or self.flat=scalar, and always
+ interprets its argument as a scalar.
+\end_layout
+
+\begin_layout Standard
+\begin_inset Float table
+wide false
+sideways false
+status open
+
+\begin_layout Standard
+\begin_inset Caption
+
+\begin_layout Standard
+Array conversion methods
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+\begin_inset ERT
+status collapsed
+
+\begin_layout Standard
+
+
+\backslash
+setlength{
+\backslash
+extrarowheight}{0.1eM}
+\end_layout
+
+\begin_layout Standard
+
+\end_layout
+
+\begin_layout Standard
+
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+\align center
+\begin_inset Tabular
+<lyxtabular version="3" rows="15" columns="3">
+<features>
+<column alignment="center" valignment="top" leftline="true" width="0">
+<column alignment="center" valignment="top" leftline="true" width="30text%">
+<column alignment="center" valignment="top" leftline="true" rightline="true" width="0">
+<row topline="true" bottomline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\family sans
+\series bold
+\size large
+Method
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\family sans
+\series bold
+\size large
+Arguments
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\family sans
+\series bold
+\size large
+Description
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\series bold
+astype
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+(dtype {None})
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+Cast to another data type
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\series bold
+byteswap
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+(inplace {False})
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+Byteswap array elements
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\series bold
+copy
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+()
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+Copy array
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\series bold
+dump
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+(file)
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+Pickle to stream or file
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\series bold
+dumps
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+()
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+Get pickled string
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\series bold
+fill
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+(scalar)
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+Fill an array with scalar value
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\series bold
+getfield
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+(dtype=, offset=0)
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+Return a field of the array
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\series bold
+setflags
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+(write=None, align=None, uic=None)
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+Set array flags
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\series bold
+tofile
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+(file=, sep='', format='')
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+Raw write to file
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\series bold
+tolist
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+()
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+Array as a nested list
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\series bold
+item
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+(*args)
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+Python scalar extraction
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\series bold
+itemset
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+(*args)
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+Insert scalar (last argument) into array
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\series bold
+tostring
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+(order='C')
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+String of raw memory
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true" bottomline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\series bold
+view
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+(obj)
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+View as another data type or class
+\end_layout
+
+\end_inset
+</cell>
+</row>
+</lyxtabular>
+
+\end_inset
+
+
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Subsection
+Array shape manipulation
+\end_layout
+
+\begin_layout Standard
+For reshape, resize, and transpose, the single tuple argument may be replaced
+ with
+\begin_inset Formula $n$
+\end_inset
+
+ integers which will be interpreted as an
+\begin_inset Formula $n$
+\end_inset
+
+-tuple.
+\end_layout
+
+\begin_layout Description
+reshape
+\begin_inset LatexCommand index
+name "ndarray!methods!reshape"
+
+\end_inset
+
+ (newshape, order='C')
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Return an array that uses the same data as this array but has a new shape
+ given by the newshape tuple (or a scalar to reshape as 1-d).
+ The new shape must define an array with the same total number of elements.
+ If one of the elements of the new shape tuple is -1, then that dimension
+ will be determined such that the overall number of items in the array stays
+ constant.
+ If possible, the new array will reference the data of the old one.
+ If the data must be moved in order to accomplish the reshape, then then
+ the new array will contain a copy of the data in self.
+ The order argument specifies how the array data should be viewed during
+ the reshape (either in 'C' or 'FORTRAN' order).
+ This order argument specifies both how the intrinsic raveling to a 1-d
+ array should occur as well as how that 1-d array should be used to fill-up
+ the new output array.
+
+\end_layout
+
+\begin_layout Description
+resize
+\begin_inset LatexCommand index
+name "ndarray!methods!resize"
+
+\end_inset
+
+ (newshape, refcheck=1, order='C')
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Resize an array in-place.
+ This changes self (in-place) to be an array with the new shape, reallocating
+ space for the data area if necessary.
+ If the data memory must be changed because the number of new elements is
+ different than self.size, then an error will occur if this array does not
+ own its data or if another object is referencing this one.
+ Only a single-segment array can be resized.
+ The method returns None.
+ To bypass the reference count check, then set refcheck=0.
+ The purpose of the reference count check is to make sure you don't use
+ this array as a buffer for another Python object and then reallocate the
+ memory.
+ However, reference counts can increase in other ways so if you are sure
+ that you have not shared the memory for this array to another Python object,
+ then you may safely set refcheck=0.
+
+\end_layout
+
+\begin_layout Description
+transpose
+\begin_inset LatexCommand index
+name "ndarray!methods!transpose"
+
+\end_inset
+
+ (<None>)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Return an array view with the shape transposed according to the argument.
+ An argument of None is equivalent to range(self.ndim)[::-1].
+ The argument can either be a tuple or multiple integer arguments.
+ This method returns a new array with permuted shape and strides attributes
+ using the same data as self.
+
+\end_layout
+
+\begin_layout MyCode
+>>> a = arange(40).reshape((2,4,5))
+\newline
+>>> b = a.transpose(2,0,1)
+\newline
+>>> print a.shape,
+ b.shape
+\newline
+(2, 4, 5) (5, 2, 4)
+\newline
+>>> print a.strides, b.strides
+\newline
+(80, 20, 4) (4, 80,
+ 20)
+\newline
+>>> print a
+\newline
+[[[ 0 1 2 3 4]
+\newline
+ [ 5 6 7 8 9]
+\newline
+ [10 11 12 13 14]
+\newline
+ [15
+ 16 17 18 19]]
+\newline
+
+\newline
+ [[20 21 22 23 24]
+\newline
+ [25 26 27 28 29]
+\newline
+ [30 31 32 33 34]
+\newline
+ [35
+ 36 37 38 39]]]
+\newline
+>>> print b
+\newline
+[[[ 0 5 10 15]
+\newline
+ [20 25 30 35]]
+\newline
+
+\newline
+ [[ 1 6 11 16]
+\newline
+
+ [21 26 31 36]]
+\newline
+
+\newline
+ [[ 2 7 12 17]
+\newline
+ [22 27 32 37]]
+\newline
+
+\newline
+ [[ 3 8 13 18]
+\newline
+ [23 28 33
+ 38]]
+\newline
+
+\newline
+ [[ 4 9 14 19]
+\newline
+ [24 29 34 39]]]
+\end_layout
+
+\begin_layout Description
+swapaxes
+\begin_inset LatexCommand index
+name "ndarray!methods!swapaxes"
+
+\end_inset
+
+ (axis1, axis2)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Return an array view with axis1 and axis2 swapped.
+ This is a special case of the transpose method with argument equal to arg=range
+(self.ndim); arg[axis1], arg[axis2] = arg[axis2], arg[axis1].
+ See the
+\series bold
+rollaxis
+\series default
+ function for a routine that transposes the array with the axes rolled instead
+ of swapped.
+
+\end_layout
+
+\begin_layout Description
+flatten
+\begin_inset LatexCommand index
+name "ndarray!methods!flatten"
+
+\end_inset
+
+ (order='C')
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Return a new 1-d array with data copied from self.
+ Equivalent to but slightly faster then a.flat.copy().
+
+\end_layout
+
+\begin_layout Description
+ravel
+\begin_inset LatexCommand index
+name "ndarray!methods!ravel"
+
+\end_inset
+
+ (order='C')
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Return a 1-d version of self.
+ If self is single-segment, then the new array references self, otherwise,
+ a copy is made.
+\end_layout
+
+\begin_layout Description
+squeeze
+\begin_inset LatexCommand index
+name "ndarray!methods!squeeze"
+
+\end_inset
+
+ ()
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Return an array with all unit-length dimensions squeezed out.
+\end_layout
+
+\begin_layout Subsection
+Array item selection and manipulation
+\end_layout
+
+\begin_layout Standard
+For array methods that take an axis keyword, it defaults to None.
+ If axis is None, then the array is treated as a 1-D array.
+ Any other value for axis represents the dimension along which the operation
+ should proceed.
+
+\end_layout
+
+\begin_layout Description
+take
+\begin_inset LatexCommand index
+name "ndarray!methods!take"
+
+\end_inset
+
+ (indices=, axis=None, out=None, mode='raise')
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ The functionality of this method is available using the advanced indexing
+ ability of the
+\family typewriter
+ndarray
+\family default
+ object.
+ However, for doing selection along a single axis it is usually faster to
+ use take.
+ If axis is not None, this method is equivalent to
+\family typewriter
+self[indxobj]
+\family default
+ preceeded by
+\family typewriter
+indxobj=[slice(None)]*self.ndim; indxobj[
+\series bold
+axis
+\series default
+] =
+\family default
+
+\family typewriter
+\series bold
+indices
+\family default
+\series default
+.
+ It returns the elements or sub-arrays from self indicated by the index
+ numbers in indices.
+ If axis is None, then this method is equivalent to
+\family typewriter
+self.flat[indices]
+\family default
+.
+ The out and mode arguments allow for specification of the output array
+ and how out-of-bounds indices will be handled ('raise': raise an error,
+ 'wrap': wrap around, 'clip': clip to range)
+\end_layout
+
+\begin_layout Description
+put
+\begin_inset LatexCommand index
+name "ndarray!methods!put"
+
+\end_inset
+
+ (indices=, values=, mode='raise')
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Performs the equivalent of
+\end_layout
+
+\begin_layout LyX-Code
+for n in
+\series bold
+indices
+\series default
+:
+\end_layout
+
+\begin_layout LyX-Code
+ self.flat[n] =
+\series bold
+values
+\series default
+[n]
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Values is repeated if it is too short.
+ The mode argument specifies what to do if n is too large.
+
+\end_layout
+
+\begin_layout Description
+repeat
+\begin_inset LatexCommand index
+name "ndarray!methods!repeat"
+
+\end_inset
+
+ (repeats=, axis=None)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Copy elements (or sub-arrays selected along axis) of self
+\series bold
+repeats
+\series default
+ times.
+ The repeats argument must be a sequence of length self.shape[axis] or a
+ scalar.
+ The repeats argument dictates how many times the element (or sub-array)
+ will be repeated in the result array.
+
+\end_layout
+
+\begin_layout Description
+choose
+\begin_inset LatexCommand index
+name "ndarray!methods!choose"
+
+\end_inset
+
+ (choices, out=None, mode='raise')
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ The array must be an integer (or bool) array with entries from
+\begin_inset Formula $0$
+\end_inset
+
+ to
+\begin_inset Formula $n$
+\end_inset
+
+.
+ Choices is a tuple of
+\begin_inset Formula $n$
+\end_inset
+
+ choice arrays:
+\begin_inset Formula $b0,\, b1,\,\ldots\,,\, bn$
+\end_inset
+
+.
+ (Alternatively, choices can be replaced with
+\begin_inset Formula $n$
+\end_inset
+
+ arguments where each argument is a choice array).
+ The return array will be formed from the elements of the choice arrays
+ according to the value of the elements of self.
+ In other words, the output array will merge the choice arrays together
+ by using the value of self at a particular position to select which choice
+ array should be used for the output at a particular position.
+ The out keyword allows specification of an output array and the clip keyword
+ allows different behavior when self contains entries outside the number
+ of choices.
+ The acceptable arguments to mode are 'raise' (RAISE), 'wrap' (WRAP), and
+ 'clip' (CLIP) ('raise' produces an error, 'wrap' converts the number into
+ range by periodic wrapping so that numbers <0 have
+\begin_inset Formula $n$
+\end_inset
+
+ repeatedly added and numbers >=
+\begin_inset Formula $n$
+\end_inset
+
+ have
+\begin_inset Formula $n$
+\end_inset
+
+ repeatedly subtracted, and 'clip' will clip all entries to be within the
+ range [0,
+\begin_inset Formula $n$
+\end_inset
+
+).
+\end_layout
+
+\begin_layout MyCode
+>>> a = array([0,3,2,1])
+\newline
+>>> a.choose([0,1,2,3],[10,11,12,13],
+\newline
+...
+ [20,21,22,23],[30,31,32,33])
+\newline
+array([ 0, 31, 22, 13])
+\end_layout
+
+\begin_layout Description
+sort
+\begin_inset LatexCommand index
+name "ndarray!methods!sort"
+
+\end_inset
+
+ (axis=-1, kind='quick', order=None)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Sort the array in-place and return None.
+ The sort takes place over the given axis using an underlying sort algorithm
+ specified by kind.
+ The sorting algorithms available are 'quick', 'heap', and 'merge'.
+ For flexible types only the quicksort algorithm is available.
+ For arrays with fields defined, the order keyword allows specification
+ of the order in which to use the field names in the sort.
+ If order is a string then it is the field name to use to define the sort.
+ If order is a list (or tuple) of strings, then it specifies a lexicographic
+ ordering so that the first listed field name is compared first if that
+ results in equality, the second listed field name is used for the comparison
+ and so on.
+ If order is None, then arrays with fields use the first field for comparison.
+
+\end_layout
+
+\begin_layout MyCode
+>>> a=array([[0.2,1.3,2.5],[1.5,0.1,1.4]]);
+\newline
+>>> b=a.copy(); b.sort(0); print b
+\newline
+[[
+ 0.2 0.1 1.4]
+\newline
+ [ 1.5 1.3 2.5]]
+\newline
+>>> b=a.copy(); b.sort(1); print b
+\newline
+[[ 0.2 1.3 2.5]
+\newline
+
+ [ 0.1 1.4 1.5]]
+\end_layout
+
+\begin_layout Description
+argsort
+\begin_inset LatexCommand index
+name "ndarray!methods!argsort"
+
+\end_inset
+
+ (axis=-1, kind='quick', order=None)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Return an index array of the same size as self showing which indices along
+ the given axis should be selected to sort self along that axis.
+ Uses an underlying sort algorithm specified by kind.
+ The sorting algorithms available are 'quick', 'heap', and 'merge'.
+ For arrays with fields defined, the order keyword allows specification
+ of the order in which to use the field names in the sort.
+ If order is a string then it is the field name to use to define the sort.
+ If order is a list (or tuple) of strings, then it specifies a lexicographic
+ ordering so that the first listed field name is compared first if that
+ results in equality, the second listed field name is used for the comparison
+ and so on.
+ If order is None, then arrays with fields use the first field for comparison.
+
+\end_layout
+
+\begin_layout MyCode
+>>> b=a.copy(); print b.argsort(0)
+\newline
+[[0 1 1]
+\newline
+ [1 0 0]]
+\newline
+>>> b=a.copy(); print b.argsort(1
+)
+\newline
+[[0 1 2]
+\newline
+ [1 2 0]]
+\end_layout
+
+\begin_layout Tip
+Complex valued arrays sort lexicographically by comparing first the real
+ parts and then the imaginary parts if the real parts are the same.
+\end_layout
+
+\begin_layout Description
+searchsorted
+\begin_inset LatexCommand index
+name "ndarray!methods!searchsorted"
+
+\end_inset
+
+ (values, side='left')
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Return an index array (dtype=intp) of the same shape as values showing
+ the index where the value would fit in self.
+ The index is such that self[index-1]
+\begin_inset Formula $<$
+\end_inset
+
+ value
+\begin_inset Formula $\le$
+\end_inset
+
+ self[index] when side is 'left'.
+ In this formula self[self.size]=
+\begin_inset Formula $\infty$
+\end_inset
+
+ and self[-1]=
+\begin_inset Formula $-\infty$
+\end_inset
+
+.
+ Therefore, if value is larger than all elements of self, then index is
+ self.size.
+ If value is smaller than all elements of self, then index is 0.
+ Self must be a sorted 1-d array.
+ If elements of self are repeated, the index of the first occurrence is
+ used.
+ If side is 'right', then the search rule is switched so that the
+\begin_inset Formula $<$
+\end_inset
+
+ sign is on the
+\begin_inset Quotes eld
+\end_inset
+
+right
+\begin_inset Quotes erd
+\end_inset
+
+ instead of the left in the search rule.
+ In other words, the index returned is such that self[index-1]
+\begin_inset Formula $\le$
+\end_inset
+
+value
+\begin_inset Formula $<$
+\end_inset
+
+ self[index].
+\end_layout
+
+\begin_layout MyCode
+>>> b=a.ravel(); b.sort()
+\newline
+>>> b.searchsorted([0.0, 1.35, 2.0, 3.0])
+\newline
+array([0, 3,
+ 5, 6])
+\end_layout
+
+\begin_layout Description
+nonzero
+\begin_inset LatexCommand index
+name "ndarray!methods!nonzero"
+
+\end_inset
+
+ ()
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Return the
+\begin_inset Formula $n$
+\end_inset
+
+-dimensional indices for elements of the
+\begin_inset Formula $n$
+\end_inset
+
+-dimensional array self that are nonzero into an
+\begin_inset Formula $n$
+\end_inset
+
+-tuple of equal-length index arrays.
+ In particular, notice that a 0-dimensional array always returns an empty
+ tuple.
+
+\end_layout
+
+\begin_layout MyCode
+>>> x = arange(15); y=x.reshape(3,5)
+\newline
+>>> (x>8).nonzero()
+\newline
+(array([ 9, 10, 11,
+ 12, 13, 14]),)
+\newline
+>>> (y>8).nonzero()
+\newline
+(array([1, 2, 2, 2, 2, 2]), array([4, 0,
+ 1, 2, 3, 4]))
+\end_layout
+
+\begin_layout Description
+compress
+\begin_inset LatexCommand index
+name "ndarray!methods!compress"
+
+\end_inset
+
+ (condition=, axis=None, out=None)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ This method expects condition to be a one-dimensional mask array of the
+ same length as self.shape[axis].
+ If the array is less than self.shape[axis], then False is assumed for the
+ missing elements.
+ The method returns the elements (or sub-arrays along the given axis) of
+ self where condition is true.
+ The shape of the return array is self.shape with the axis dimension replaced
+ by the number of True elements of condition.
+ The same effect can often be accomplished using array indexing.
+\end_layout
+
+\begin_layout MyCode
+>>> x=array([0,1,2,3])
+\newline
+>>> x.compress(x > 2)
+\newline
+array([3])
+\newline
+>>> x[x>2]
+\newline
+array([3])
+\end_layout
+
+\begin_layout Description
+diagonal
+\begin_inset LatexCommand index
+name "ndarray!methods!diagonal"
+
+\end_inset
+
+ (offset=0, axis1=0, axis2=1)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ If self is 2-d, return the
+\series bold
+offset
+\series default
+ (from the main diagonal) diagonal of self.
+ If self is larger than 2-d, then return an array constructed from all the
+ diagonals created from all the 2-d sub-arrays formed using all of axis1
+ and axis2.
+ The offset parameter is with respect to axis2.
+ The shape of the returned array is found by removing the axis1 and axis2
+ entries from self.shape and then appending the length of the offset diagonal
+ of each 2-d sub-array.
+\end_layout
+
+\begin_layout MyCode
+>>> a=arange(25).reshape(5,5); print a
+\newline
+[[ 0 1 2 3 4]
+\newline
+ [ 5 6 7 8 9]
+\newline
+
+ [10 11 12 13 14]
+\newline
+ [15 16 17 18 19]
+\newline
+ [20 21 22 23 24]]
+\newline
+>>> print a.diagonal()
+\newline
+[
+ 0 6 12 18 24]
+\newline
+>>> print a.diagonal(1)
+\newline
+[ 1 7 13 19]
+\newline
+>>> print a.diagonal(-1)
+\newline
+[
+ 5 11 17 23]
+\end_layout
+
+\begin_layout Standard
+\begin_inset Float table
+wide false
+sideways false
+status open
+
+\begin_layout Standard
+\begin_inset Caption
+
+\begin_layout Standard
+Array item selection and shape manipulation methods.
+ If axis is an argument, then the calculation is performed along that axis.
+ An axis value of None means the array is flattened before calculation proceeds.
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+\begin_inset ERT
+status collapsed
+
+\begin_layout Standard
+
+
+\backslash
+setlength{
+\backslash
+extrarowheight}{0.25eM}
+\end_layout
+
+\begin_layout Standard
+
+\end_layout
+
+\begin_layout Standard
+
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+\align center
+\begin_inset Tabular
+<lyxtabular version="3" rows="18" columns="3">
+<features>
+<column alignment="center" valignment="top" leftline="true" width="0">
+<column alignment="center" valignment="top" leftline="true" width="50text%">
+<column alignment="block" valignment="top" leftline="true" rightline="true" width="30text%">
+<row topline="true" bottomline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\family sans
+\series bold
+\size large
+Method
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\family sans
+\series bold
+\size large
+Arguments
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\family sans
+\series bold
+\size large
+Description
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\series bold
+argsort
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+argsort (axis=None, kind='quick')
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+Indices showing how to sort array.
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\series bold
+choose
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+choose (c0, c1 , ..., cn, out=None, clip='raise')
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+Choose from different arrays based on value of self.
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\series bold
+compress
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+(condition=, axis=None, out=None)
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+Elements of self where condition is true.
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\series bold
+diagonal
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+(offset=0, axis1=0, axis2=1)
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+Return a diagonal from self.
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\series bold
+flatten
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+(order='C')
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+A 1-d copy of self.
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\series bold
+nonzero
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+()
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+True where self is not zero.
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\series bold
+put
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+(indices=, values=, mode='raise')
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+Place values at 1-d index locations of self.
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\series bold
+ravel
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+(order='C')
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+1-d version of self (no data copy if self is C-style contiguous).
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\series bold
+repeat
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+(repeats=, axis=None)
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+Repeat elements of self.
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\series bold
+reshape
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+(d1,d2,...,dn, order='C')
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+Return reshaped version of self.
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\series bold
+resize
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+(d1,d2,...,dn, refcheck=1, order='Any')
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+Resize self in-place.
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\series bold
+searchsorted
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+(values)
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+Show where values would be placed in self (assumed sorted).
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\series bold
+sort
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+(axis=None, kind='quick')
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+Copy of self sorted along axis.
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\series bold
+squeeze
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+()
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+Squeeze out all length-1 dimensions.
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\series bold
+swapaxes
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+(axis1, axis2)
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+Swap two dimensions of self.
+
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\series bold
+take
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+(indices=, axis=None, out=None, mode='raise')
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+Select elements of self along axis according to indices.
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true" bottomline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\series bold
+transpose
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+(permute <None>)
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+Rearrange shape of self according to permute.
+\end_layout
+
+\end_inset
+</cell>
+</row>
+</lyxtabular>
+
+\end_inset
+
+
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Subsection
+Array calculation
+\end_layout
+
+\begin_layout Standard
+Many of these methods take an argument named axis.
+ In such cases, if axis is None (the default), the array is treated as a
+ 1-d array and the operation is performed over the entire array.
+ This behavior is also the default if self is a 0-dimensional array or array
+ scalar.
+ If axis is an integer, then the operation is done over the given axis (for
+ each 1-d subarray that can be created along the given axis).
+ The parameter dtype specifies the data type over which a reduction operation
+ (like summing) should take place.
+ The default reduce data type is the same as the data type of self.
+ To avoid overflow, it can be useful to perform the reduction using a larger
+ data type.
+ For several methods, an optional out argument can be provided and the result
+ will be placed into the output array given.
+ The out argument must be an ndarray and have the same number of elements.
+ It can be of a different type in which case casting will be performed.
+
+\end_layout
+
+\begin_layout Description
+max
+\begin_inset LatexCommand index
+name "ndarray!methods!max"
+
+\end_inset
+
+ (axis=None, out=None)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Return the largest value in self.
+ This is a better way to compute the maximum over an array, than using max(self).
+ The latter uses the generic sequence interface to self.
+ This will be slower, and will try to get an answer by comparing whole sub-array
+s of self.
+ This will be incorrect for arrays larger than 1-d.
+\end_layout
+
+\begin_layout Description
+argmax
+\begin_inset LatexCommand index
+name "ndarray!methods!argmax"
+
+\end_inset
+
+ (axis=None, out=None)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Return the (first, 1-d) index of the largest value in self.
+\end_layout
+
+\begin_layout Description
+min
+\begin_inset LatexCommand index
+name "ndarray!methods!min"
+
+\end_inset
+
+ (axis=None, out=None)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Return the smallest value in self.
+ This is a better way to compute the minimum over an array, than using min(self).
+ The latter uses the generic sequence interface to self.
+ This will be slower, and will try to get an answer by comparing whole sub-array
+s of self.
+ This will be incorrect for arrays larger than 1-d.
+\end_layout
+
+\begin_layout Description
+argmin
+\begin_inset LatexCommand index
+name "ndarray!methods!argmin"
+
+\end_inset
+
+ (axis=None, out=None)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Return the (first, 1-d) index of the smallest value in self.
+\end_layout
+
+\begin_layout Description
+ptp
+\begin_inset LatexCommand index
+name "ndarray!methods!ptp"
+
+\end_inset
+
+ (axis=None, out=None)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Return the difference of the largest to the smallest value in self.
+ Equivalent to self.max(axis) - self.min(axis)
+\end_layout
+
+\begin_layout Description
+clip
+\begin_inset LatexCommand index
+name "ndarray!methods!clip"
+
+\end_inset
+
+ (min=,max=, out=None)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Return a new array where any element in self less than min is set to min
+ and any element less than max is set to max.
+ Equivalent to self[self<min]=min; self[self>max]=max.
+\end_layout
+
+\begin_layout Description
+conj
+\begin_inset LatexCommand index
+name "ndarray!methods!conj"
+
+\end_inset
+
+ (out=None)
+\end_layout
+
+\begin_layout Description
+conjugate
+\begin_inset LatexCommand index
+name "ndarray!methods!conjugate"
+
+\end_inset
+
+ (out=None)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Return the conjugate of elements of the array.
+\end_layout
+
+\begin_layout Description
+round
+\begin_inset LatexCommand index
+name "ndarray!methods!round"
+
+\end_inset
+
+ (decimals=0, out=None)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Round the elements of the array to the nearest decimal.
+ For decimals < 0, the rounding is done to the nearest tens, hundreds, etc.
+ Rounding of exactly the half-interval is to the nearest even integer.
+ This is the only difference with standard Python rounding.
+\end_layout
+
+\begin_layout Description
+trace
+\begin_inset LatexCommand index
+name "ndarray!methods!trace"
+
+\end_inset
+
+ (offset=0, axis1=0, axis2=1, dtype=None, out=None)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Perform a summation along each diagonal specified by offset, axis1, and
+ axis2.
+ Equivalent to diagonal(offset,axis1,axis2).sum(axis=-1, dtype=dtype)
+\end_layout
+
+\begin_layout Description
+sum
+\begin_inset LatexCommand index
+name "ndarray!methods!sum"
+
+\end_inset
+
+ (axis=None, dtype=None, out=None)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Return the sum
+\begin_inset Formula \[
+\sum_{i=0}^{N-1}\textrm{self}[\underbrace{:,\ldots,:}_{\textrm{axis}},i]\]
+
+\end_inset
+
+ where axis ':' objects are placed before the
+\begin_inset Formula $i.$
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+cumsum
+\begin_inset LatexCommand index
+name "ndarray!methods!cumsum"
+
+\end_inset
+
+ (axis=None, dtype=None, out=None)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Return the cumulative sum.
+ If ret is the return array of the same shape as
+\begin_inset Formula $\textrm{self},$
+\end_inset
+
+ then
+\begin_inset Formula \[
+\textrm{ret}[\underbrace{:,\ldots,:}_{\textrm{axis}},j]=\sum_{i=0}^{j}\textrm{self}[\underbrace{:,\ldots,:}_{\textrm{axis}},i].\]
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+mean
+\begin_inset LatexCommand index
+name "ndarray!methods!mean"
+
+\end_inset
+
+ (axis=None, dtype=None, out=None)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Return the average value caculated as
+\begin_inset Formula \[
+\frac{1}{N}\sum_{i=0}^{N-1}\textrm{self}[\underbrace{:,\ldots,:}_{\textrm{axis}},i]\]
+
+\end_inset
+
+ where
+\begin_inset Formula $N$
+\end_inset
+
+ is self.shape[axis] and axis ':' objects are placed before the
+\begin_inset Formula $i.$
+\end_inset
+
+ The sum is done in the data-type of self unless self is an integer or Boolean
+ data-type and then it is done over the float data-type.
+
+\end_layout
+
+\begin_layout Description
+var
+\begin_inset LatexCommand index
+name "ndarray!methods!var"
+
+\end_inset
+
+ (axis=None, dtype=None, out=None)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Return the variance of the data calculated as
+\begin_inset Formula \[
+\frac{1}{N}\sum_{i=0}^{N-1}\left(\textrm{self}[\underbrace{:,\ldots,:}_{\textrm{axis}},i]-\mu\right)^{2}\]
+
+\end_inset
+
+ where
+\begin_inset Formula $N$
+\end_inset
+
+ is self.shape[axis] and
+\begin_inset Formula $\mu$
+\end_inset
+
+ is the mean (restored to the same number of dimensions as self with
+\begin_inset Formula $\mu$
+\end_inset
+
+ copied along the axis dimension).
+ This is equivalent to (self**2).mean - self.mean()**2 and ((self-self.mean())**2).m
+ean().
+ The value of
+\begin_inset Formula $N-1$
+\end_inset
+
+ was not chosen for normalization because while it gives an
+\begin_inset Quotes eld
+\end_inset
+
+unbiased
+\begin_inset Quotes erd
+\end_inset
+
+ estimate, it is not always prudent to return unbiased estimates as they
+ may have larger mean-square error.
+ The sum is done using a float data-type if self has integer or Boolean
+ data-type, otherwise it is done using the same data-type as self.
+
+\end_layout
+
+\begin_layout Description
+std
+\begin_inset LatexCommand index
+name "ndarray!methods!std"
+
+\end_inset
+
+ (axis=None, dtype=None, out=None)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Return the standard deviation calculated as
+\begin_inset Formula \[
+\sqrt{\frac{1}{N}\sum_{i=0}^{N-1}\left(\textrm{self}[\underbrace{:,\ldots,:}_{\textrm{axis}},i]-\mu\right)^{2}}\]
+
+\end_inset
+
+ where
+\begin_inset Formula $N$
+\end_inset
+
+ is self.shape[axis] and
+\begin_inset Formula $\mu$
+\end_inset
+
+ is the mean (restored to the same number of dimensions as self with
+\begin_inset Formula $\mu$
+\end_inset
+
+ copied along the axis dimension).
+ The sum is done using the same data-type as self unless self is an integer
+ or Boolean data-type and then it is done using a float data-type.
+
+\end_layout
+
+\begin_layout Description
+prod
+\begin_inset LatexCommand index
+name "ndarray!methods!prod"
+
+\end_inset
+
+ (axis=None, dtype=None, out=None)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Return the product calculated as
+\begin_inset Formula \[
+\prod_{i=0}^{N-1}\textrm{self}[\underbrace{:,\ldots,:}_{\textrm{axis}},i].\]
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+cumprod
+\begin_inset LatexCommand index
+name "ndarray!methods!cumprod"
+
+\end_inset
+
+ (axis=None, dtype=None, out=None)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Return the cumulative product so that the return array, ret, is the same
+ shape as self and
+\begin_inset Formula \[
+\textrm{ret}[\underbrace{:,\ldots,:}_{\textrm{axis}},j]=\prod_{i=0}^{j}\textrm{self}[\underbrace{:,\ldots,:}_{\textrm{axis}},i].\]
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+all
+\begin_inset LatexCommand index
+name "ndarray!methods!all"
+
+\end_inset
+
+ (axis=None, out=None)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Return True if all entries along axis evaluate True, otherwise return False.
+\end_layout
+
+\begin_layout Description
+any
+\begin_inset LatexCommand index
+name "ndarray!methods!any"
+
+\end_inset
+
+ (axis=None, out=None)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Return True if any entries along axis evaluate True, otherwise return False
+\begin_inset LatexCommand index
+name "ndarray!methods|)"
+
+\end_inset
+
+.
+\end_layout
+
+\begin_layout Standard
+\begin_inset Float table
+wide false
+sideways false
+status open
+
+\begin_layout Standard
+\begin_inset Caption
+
+\begin_layout Standard
+Array object calculation methods.
+ If axis is an argument, then the calculation is performed along that axis.
+ An axis value of None means the array is flattened before calculation proceeds.
+ All of these methods can take an optional out= argument which can specify
+ the output array to write the results into.
+
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+\begin_inset ERT
+status collapsed
+
+\begin_layout Standard
+
+
+\backslash
+setlength{
+\backslash
+extrarowheight}{0.5eM}
+\end_layout
+
+\begin_layout Standard
+
+\end_layout
+
+\begin_layout Standard
+
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+\align center
+\begin_inset Tabular
+<lyxtabular version="3" rows="18" columns="3">
+<features>
+<column alignment="center" valignment="top" leftline="true" width="0">
+<column alignment="center" valignment="top" leftline="true" width="30text%">
+<column alignment="center" valignment="top" leftline="true" rightline="true" width="0">
+<row topline="true" bottomline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\family sans
+\series bold
+\size large
+Method
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\family sans
+\series bold
+\size large
+Arguments
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\family sans
+\series bold
+\size large
+Description
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\series bold
+all
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+(axis=None)
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+true if all entries are true.
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\series bold
+any
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+(axis=None)
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+true if any entries are true.
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\series bold
+argmax
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+(axis=None)
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+index of largest value.
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\series bold
+argmin
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+(axis=None)
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+index of smallest value.
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\series bold
+clip
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+(min=, max=)
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+self[self>max]=max; self[self<min]=min
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\series bold
+conj
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+()
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+complex conjugate
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\series bold
+cumprod
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+(axis=None, dtype=None)
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+cumulative product
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\series bold
+cumsum
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+(axis=None, dtype=None)
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+cumulative sum
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\series bold
+max
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+(axis=None)
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+maximum of self
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\series bold
+mean
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+(axis=None, dtype=None)
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+mean of self
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\series bold
+min
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+(axis=None)
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+minimum of self
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\series bold
+prod
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+(axis=None, dtype=None)
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+multiply elements of self together
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\series bold
+ptp
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+(axis=None)
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+self.max(axis)-self.min(axis)
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\series bold
+var
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+(axis=None, dtype=None)
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+variance of self
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\series bold
+std
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+(axis=None, dtype=None)
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+standard deviation of self
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\series bold
+sum
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+(axis=None, dtype=None)
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+add elements of self together
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true" bottomline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+
+\series bold
+trace
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+(offset, axis1=0, axis2=0, dtype=None)
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+sum along a diagonal
+\end_layout
+
+\end_inset
+</cell>
+</row>
+</lyxtabular>
+
+\end_inset
+
+
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Section
+Array Special Methods
+\end_layout
+
+\begin_layout Standard
+Methods
+\begin_inset LatexCommand index
+name "ndarray!special methods|("
+
+\end_inset
+
+ in this chapter are not generally meant to be called directly by the user.
+ They are called by Python and are used to customize behavior of the ndarray
+ object as it interacts with the Python language and standard library.
+
+\end_layout
+
+\begin_layout Subsection
+Methods for standard library functions
+\end_layout
+
+\begin_layout Description
+__copy__
+\begin_inset LatexCommand index
+name "ndarray!special methods!copy"
+
+\end_inset
+
+ ()
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ To allow copy.copy(a) to perform a shallow copy of an array.
+ Exactly the same as self.copy() (contents of object arrays are not copied).
+
+\end_layout
+
+\begin_layout Description
+__deepcopy__
+\begin_inset LatexCommand index
+name "ndarray!special methods!deepcopy"
+
+\end_inset
+
+ (memodict)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ To allow copy.deepcopy(a) to perform a deep copy.
+ This is the same as a shallow copy unless self is an object array.
+ Then, after the shallow copy is made, a copy.deepcopy(item) is called for
+ every item in the object array.
+
+\end_layout
+
+\begin_layout Description
+__reduce__
+\begin_inset LatexCommand index
+name "ndarray!special methods!reduce"
+
+\end_inset
+
+ ()
+\end_layout
+
+\begin_layout Description
+__setstate__
+\begin_inset LatexCommand index
+name "ndarray!special methods!setstate"
+
+\end_inset
+
+ (shape, typestr, isfortran, data)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Pickling support for arrays is provided by these two methods.
+ When an array needs to be pickled, the __reduce__() method is called to
+ provide a 3-tuple of already-pickleable objects.
+ To construct a new object from the pickle, the first two elements of the
+ 3-tuple are used to construct a new (0-length) array of the correct type
+ and the last element of the 3-tuple, which is itself a 4-tuple of (shape,
+ typestr, isfortran, data) is passed to the __setstate__ method of the newly
+ created array to restore its contents.
+
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ The reduce method returns a 3-tuple consisting of (callable, args, state)
+ where callable is a simple constructor function that handles subclasses
+ of the ndarray.
+ Also, args is a 3-tuple of arguments to pass to this constructor function
+ (type(self), (0,), self.dtypechar), and state is a 4-tuple of information
+ giving the object's state (self.shape, self.dtypedescr, isfortran, string_or_list
+).
+ In this tuple, isfortran is a Bool stating whether the following flattened
+ data is in Fortran order or not, and string_or_list is a string formed
+ by self.tostring() if the data type is not object.
+ If the data type of self is an object array, then string_or_list is a flat
+ list equivalent to self.ravel().tolist().
+
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ On load from a pickle, the pickling code uses the first two elements from
+ the tuple returned by reduce to construct an empty 0-dimensional subclass
+ of the correct type.
+ The last element is then passed to the __setstate__ method of the newly
+ created array to restore its contents.
+
+\end_layout
+
+\begin_layout Note
+When data is a string, the __setstate__ method will directly use the string
+ memory as the array memory (new.base will point to the string).
+ The typestr contains enough information to decode how the memory should
+ be interpreted.
+\end_layout
+
+\begin_layout Subsection
+Basic customization
+\end_layout
+
+\begin_layout Description
+__new__
+\begin_inset LatexCommand index
+name "ndarray!special methods!new"
+
+\end_inset
+
+ (subtype, shape=, dtype=long_, buffer=None, offset=0, strides=None, order=None)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ This method creates a new ndarray.
+ It is typically only used in the __new__ method of a subclass.
+ This method is called to construct a new array whenever the object name
+ is called,
+\family typewriter
+a=ndarray(...)
+\family default
+.
+ It supports two basic modes of array creation:
+\end_layout
+
+\begin_layout Enumerate
+a single-segment array of the specified shape and data-type from newly allocated
+ memory;
+\end_layout
+
+\begin_deeper
+\begin_layout Enumerate
+uses shape, dtype, strides, and order arguments; others are ignored;
+\end_layout
+
+\begin_layout Enumerate
+The order argument allows specification of a Fortran-style contiguous memory
+ segment (order='Fortran');
+\end_layout
+
+\begin_layout Enumerate
+If strides is given, then it specifies the new strides of the array (and
+ the order keyword is ignored).
+ The strides will be checked for consistency with the dimension size so
+ that steps outside of the memory won't occur.
+\end_layout
+
+\end_deeper
+\begin_layout Enumerate
+an array of the given shape and data type using the provided object, buffer,
+ which must export the buffer interface.
+
+\end_layout
+
+\begin_deeper
+\begin_layout Enumerate
+all arguments can be used;
+\end_layout
+
+\begin_layout Enumerate
+strides can be given and will be checked for consistency with the shape,
+ data type, and available memory in buffer;
+\end_layout
+
+\begin_layout Enumerate
+order indicates whether the data buffer should be interpreted as Fortran-style
+ contiguous (order='Fortran') or not;
+\end_layout
+
+\begin_layout Enumerate
+offset can be used to start the array data at some offset in the buffer.
+
+\end_layout
+
+\end_deeper
+\begin_layout Note
+The ndarray uses the default no-op __init__
+\begin_inset LatexCommand index
+name "ndarray!special methods!init"
+
+\end_inset
+
+ function because the array is completely initialized after __new__ is called.
+\end_layout
+
+\begin_layout Description
+__array__
+\begin_inset LatexCommand index
+name "ndarray!special methods!array"
+
+\end_inset
+
+ (dtype {None})
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ This is a special method that should always return an object of type ndarray.
+ Useful for subclasses that need to get to the ndarray object.
+
+\end_layout
+
+\begin_layout Description
+__array_wrap__
+\begin_inset LatexCommand index
+name "ndarray!special methods!array\\_wrap"
+
+\end_inset
+
+ (arr)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ This is a special method that always returns an object of the same Python
+ type as self using the array passed as an argument.
+ This is mainly useful for subclasses as it is an easy way to get the subclass
+ back from an ndarray.
+\end_layout
+
+\begin_layout Description
+__lt__
+\begin_inset LatexCommand index
+name "ndarray!special methods!lt"
+
+\end_inset
+
+ (other)
+\end_layout
+
+\begin_layout Description
+__le__
+\begin_inset LatexCommand index
+name "ndarray!special methods!le"
+
+\end_inset
+
+ (other)
+\end_layout
+
+\begin_layout Description
+__gt__
+\begin_inset LatexCommand index
+name "ndarray!special methods!gt"
+
+\end_inset
+
+ (other)
+\end_layout
+
+\begin_layout Description
+__ge__
+\begin_inset LatexCommand index
+name "ndarray!special methods!ge"
+
+\end_inset
+
+ (other)
+\end_layout
+
+\begin_layout Description
+__eq__
+\begin_inset LatexCommand index
+name "ndarray!special methods!eq"
+
+\end_inset
+
+ (other)
+\end_layout
+
+\begin_layout Description
+__ne__
+\begin_inset LatexCommand index
+name "ndarray!special methods!ne"
+
+\end_inset
+
+ (other)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Defined to support rich comparisons (<, <=, >, >=, ==, !=) on ndarrays
+ using universal functions.
+
+\end_layout
+
+\begin_layout Description
+__str__
+\begin_inset LatexCommand index
+name "ndarray!special methods!str"
+
+\end_inset
+
+ ()
+\end_layout
+
+\begin_layout Description
+__repr__
+\begin_inset LatexCommand index
+name "ndarray!special methods!repr"
+
+\end_inset
+
+ ()
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ These functions print the array when called by str(self) and repr(self)
+ respectively.
+ Array printing can be changed using set_string_function(..).
+ Default array printing has been borrowed from numarray whose printing code
+ was written by Perry Greenfield and J.
+ Todd Miller.
+ By default, arrays print such that
+\end_layout
+
+\begin_layout Enumerate
+The last axis is always printed left to right.
+\end_layout
+
+\begin_layout Enumerate
+The next-to-last axis is printed top to bottom.
+\end_layout
+
+\begin_layout Enumerate
+Remaining axes are printed top to bottom with increasing numbers of separators.
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Five parameters of the printing can be set using keyword arguments with
+
+\family typewriter
+set_printoptions(...)
+\family default
+.
+ The parameters
+\begin_inset LatexCommand index
+name "set\\_printoptions"
+
+\end_inset
+
+ can all be retrieved using
+\family typewriter
+get_printoptions()
+\family default
+.
+ These printing options
+\begin_inset LatexCommand index
+name "get\\_printoptions"
+
+\end_inset
+
+ are
+\end_layout
+
+\begin_deeper
+\begin_layout Description
+precision the number of digits of precision for floating point output (default
+ 8);
+\end_layout
+
+\begin_layout Description
+threshold total number of array elements which triggers summarization rather
+ than full representation (default 1000);
+\end_layout
+
+\begin_layout Description
+edgeitems number of array items in summary at beginning an end of each dimension
+ (default 3);
+\end_layout
+
+\begin_layout Description
+linewidth the number of characters per line for the purpose of inserting
+ line breaks (default 71);
+\end_layout
+
+\begin_layout Description
+suppress Boolean indicating whether or not to suppress printing of small
+ floating point values using scientific notation (default False).
+
+\end_layout
+
+\end_deeper
+\begin_layout Description
+__nonzero__
+\begin_inset LatexCommand index
+name "ndarray!special methods!nonzero"
+
+\end_inset
+
+ ()
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Truth-value testing for the array as a whole.
+ It is called whenever the truth value of the ndarray as a whole object
+ is required.
+ This raises an error if the number of elements in the the array is larger
+ than 1 because the truth value of such arrays is ambiguous.
+ Use .any() and .all() instead to be clear about what is meant in such cases.
+ If the number of elements is 0 then False is returned.
+ If there is one element in the array, then the truth-value of this element
+ is returned.
+\end_layout
+
+\begin_layout Subsection
+Container customization
+\end_layout
+
+\begin_layout Description
+__len__
+\begin_inset LatexCommand index
+name "ndarray!special methods!len"
+
+\end_inset
+
+ ()
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Returns self.shape[0].
+ It is called in response to len(self).
+ Use self.size to get the total number of elements in the array.
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Notice that the default Python iterator for sequences is used when arrays
+ are used in places that expect an iterator.
+ This iterator returns successively self[0], self[1], ..., self[self.__len__()].
+ Use self.flat to get an iterator that walks through the entire array one
+ element at a time.
+\end_layout
+
+\begin_layout Description
+__getitem__
+\begin_inset LatexCommand index
+name "ndarray!special methods!getitem"
+
+\end_inset
+
+ (key)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Called when evaluating self[key] construct.
+ Items from the array can be selected using this customization.
+ This construct has both standard and extended indexing abilities which
+ are explained in Section
+\begin_inset LatexCommand ref
+reference "sec:Array-indexing"
+
+\end_inset
+
+.
+ A named field can be retrieved if key is a string and fields are defined
+ in the dtypedescr object associated with this array.
+
+\end_layout
+
+\begin_layout Description
+__setitem__
+\begin_inset LatexCommand index
+name "ndarray!special methods!setitem"
+
+\end_inset
+
+ (key, value)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Called when evaluating self[key]=value.
+ Items in the array can be set using this construct.
+ This construct is explained in Section
+\begin_inset LatexCommand ref
+reference "sec:Array-indexing"
+
+\end_inset
+
+.
+ A named field can be set if key is a string and fields are defined in the
+ dtypedescr object associated with this array.
+
+\end_layout
+
+\begin_layout Description
+__getslice__
+\begin_inset LatexCommand index
+name "ndarray!special methods!getslice"
+
+\end_inset
+
+ (i, j)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Equivalent to self.__getitem__(slice(i,j)) but defined mainly so that C
+ code can use the sequence interface.
+ Called to evaluate self[i:j]
+\end_layout
+
+\begin_layout Description
+__setslice__
+\begin_inset LatexCommand index
+name "ndarray!special methods!setslice"
+
+\end_inset
+
+ (i, j, value)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Equivalent to self.__setitem__(slice(i,j), value) but defined mainly so
+ C code can use the sequence interface.
+ Called to evaluate self[i:j] = value.
+\end_layout
+
+\begin_layout Description
+__contains__
+\begin_inset LatexCommand index
+name "ndarray!special methods!contains"
+
+\end_inset
+
+ (item)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Called to determine truth value of the
+\family typewriter
+item in self
+\family default
+ construct.
+ Returns the equivalent of (self==item).any()
+\end_layout
+
+\begin_layout Subsection
+Arithmetic customization
+\end_layout
+
+\begin_layout Subsubsection
+Binary
+\end_layout
+
+\begin_layout Description
+__add__
+\begin_inset LatexCommand index
+name "ndarray!special methods!add"
+
+\end_inset
+
+ (other)
+\end_layout
+
+\begin_layout Description
+__sub__
+\begin_inset LatexCommand index
+name "ndarray!special methods!sub"
+
+\end_inset
+
+ (other)
+\end_layout
+
+\begin_layout Description
+__mul__
+\begin_inset LatexCommand index
+name "ndarray!special methods!mul"
+
+\end_inset
+
+ (self, other)
+\end_layout
+
+\begin_layout Description
+__div__
+\begin_inset LatexCommand index
+name "ndarray!special methods!div"
+
+\end_inset
+
+ (other)
+\end_layout
+
+\begin_layout Description
+__truediv__
+\begin_inset LatexCommand index
+name "ndarray!special methods!truediv"
+
+\end_inset
+
+ (other)
+\end_layout
+
+\begin_layout Description
+__floordiv__
+\begin_inset LatexCommand index
+name "ndarray!special methods!floordiv"
+
+\end_inset
+
+ (other)
+\end_layout
+
+\begin_layout Description
+__mod__
+\begin_inset LatexCommand index
+name "ndarray!special methods!mod"
+
+\end_inset
+
+ (other)
+\end_layout
+
+\begin_layout Description
+__divmod__
+\begin_inset LatexCommand index
+name "ndarray!special methods!divmod"
+
+\end_inset
+
+ (other)
+\end_layout
+
+\begin_layout Description
+__pow__
+\begin_inset LatexCommand index
+name "ndarray!special methods!pow"
+
+\end_inset
+
+ (other[,modulo])
+\end_layout
+
+\begin_layout Description
+__lshift__
+\begin_inset LatexCommand index
+name "ndarray!special methods!lshift"
+
+\end_inset
+
+ (other)
+\end_layout
+
+\begin_layout Description
+__rshift__
+\begin_inset LatexCommand index
+name "ndarray!special methods!rshift"
+
+\end_inset
+
+ (other)
+\end_layout
+
+\begin_layout Description
+__and__
+\begin_inset LatexCommand index
+name "ndarray!special methods!and"
+
+\end_inset
+
+ (other)
+\end_layout
+
+\begin_layout Description
+__or__
+\begin_inset LatexCommand index
+name "ndarray!special methods!or"
+
+\end_inset
+
+ (other)
+\end_layout
+
+\begin_layout Description
+__xor__
+\begin_inset LatexCommand index
+name "ndarray!special methods!xor"
+
+\end_inset
+
+ (other)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ These methods are defined for ndarrays to implement the operations (
+\family typewriter
++
+\family default
+,
+\family typewriter
+-
+\family default
+,
+\family typewriter
+*
+\family default
+,
+\family typewriter
+/,
+\family default
+
+\family typewriter
+/,
+\family default
+
+\family typewriter
+//
+\family default
+,
+\family typewriter
+%
+\family default
+,
+\family typewriter
+divmod()
+\family default
+,
+\family typewriter
+**
+\family default
+ or
+\family typewriter
+pow()
+\family default
+,
+\family typewriter
+<<,
+\family default
+
+\family typewriter
+>>
+\family default
+,
+\family typewriter
+&
+\family default
+,
+\family typewriter
+^
+\family default
+,
+\family typewriter
+|
+\family default
+).
+ This is done using calls to the corresponding universal function object
+ (add, subtract, multiply, divide, true_divide, floor_divide, remainder,
+ divide and remainder, power, left_shift, right_shift, bitwise_and, bitwise_xor,
+ bitwise_or).
+ These implement element-by-element operations for arrays that are broadcastable
+ to the same shape.
+
+\end_layout
+
+\begin_layout Itemize
+any third argument to
+\family typewriter
+pow()
+\family default
+ is silently ignored as the underlying ufunc (power) only takes two arguments.
+\end_layout
+
+\begin_layout Itemize
+the three division operators are all defined, div is active by default,
+ truediv is active when __future__.division is in effect.
+\end_layout
+
+\begin_layout Note
+Because it is a built-in type (written in C), the __r<op>__ special methods
+ are not directly defined for the ndarray.
+\end_layout
+
+\begin_layout Subsubsection
+In-place
+\end_layout
+
+\begin_layout Description
+__iadd__
+\begin_inset LatexCommand index
+name "ndarray!special methods!iadd"
+
+\end_inset
+
+ (other)
+\end_layout
+
+\begin_layout Description
+__isub__
+\begin_inset LatexCommand index
+name "ndarray!special methods!isub"
+
+\end_inset
+
+ (other)
+\end_layout
+
+\begin_layout Description
+__imul__
+\begin_inset LatexCommand index
+name "ndarray!special methods!imul"
+
+\end_inset
+
+ (other)
+\end_layout
+
+\begin_layout Description
+__idiv__
+\begin_inset LatexCommand index
+name "ndarray!special methods!idiv"
+
+\end_inset
+
+ (other)
+\end_layout
+
+\begin_layout Description
+__itruediv__
+\begin_inset LatexCommand index
+name "ndarray!special methods!itruediv"
+
+\end_inset
+
+ (other)
+\end_layout
+
+\begin_layout Description
+__ifloordiv__
+\begin_inset LatexCommand index
+name "ndarray!special methods!ifloordiv"
+
+\end_inset
+
+ (other)
+\end_layout
+
+\begin_layout Description
+__imod__
+\begin_inset LatexCommand index
+name "ndarray!special methods!imod"
+
+\end_inset
+
+ (other)
+\end_layout
+
+\begin_layout Description
+__ipow__
+\begin_inset LatexCommand index
+name "ndarray!special methods!ipow"
+
+\end_inset
+
+ (other)
+\end_layout
+
+\begin_layout Description
+__ilshift__
+\begin_inset LatexCommand index
+name "ndarray!special methods!ilshift"
+
+\end_inset
+
+ (other)
+\end_layout
+
+\begin_layout Description
+__irshift__
+\begin_inset LatexCommand index
+name "ndarray!special methods!irshift"
+
+\end_inset
+
+ (other)
+\end_layout
+
+\begin_layout Description
+__iand__
+\begin_inset LatexCommand index
+name "ndarray!special methods!iand"
+
+\end_inset
+
+ (other)
+\end_layout
+
+\begin_layout Description
+__ixor__
+\begin_inset LatexCommand index
+name "ndarray!special methods!ixor"
+
+\end_inset
+
+ (other)
+\end_layout
+
+\begin_layout Description
+__ior__
+\begin_inset LatexCommand index
+name "ndarray!special methods!ior"
+
+\end_inset
+
+ (other)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ These methods are implemented to handle the inplace operatiors (
+\family typewriter
++=
+\family default
+,
+\family typewriter
+-=
+\family default
+,
+\family typewriter
+*=
+\family default
+,
+\family typewriter
+/=
+\family default
+,
+\family typewriter
+/=
+\family default
+,
+\family typewriter
+//=
+\family default
+,
+\family typewriter
+%=
+\family default
+,
+\family typewriter
+**
+\family default
+=,
+\family typewriter
+<<
+\family default
+=,
+\family typewriter
+>>=
+\family default
+,
+\family typewriter
+&=
+\family default
+,
+\family typewriter
+^=
+\family default
+,
+\family typewriter
+|=
+\family default
+).
+ The inplace operators are implemented using the corresponding ufunc and
+ its ability to take an output argument (which is set as self).
+ Using inplace operations can save space and time and is therefore encouraged
+ whenever appropriate.
+
+\end_layout
+
+\begin_layout Warning
+In place operations will perform the calculation using the precision decided
+ by the data type of the two operands, but will silently downcast the result
+ (if necessary) so it can fit back into the array.
+ Therefore, for mixed precision calculations, a <op>= B can be different
+ than a = a <op> B.
+ For example, suppose a=ones((3,3)).
+ Then a+=3j is different than a=a+3j While they both perform the same computatio
+n, a+=3j casts the result to fit back in a, while a=a+3j re-binds the name
+ a to the result.
+\end_layout
+
+\begin_layout Subsubsection
+Unary operations
+\end_layout
+
+\begin_layout Description
+__neg__
+\begin_inset LatexCommand index
+name "ndarray!special methods!neg"
+
+\end_inset
+
+ (self)
+\end_layout
+
+\begin_layout Description
+__pos__
+\begin_inset LatexCommand index
+name "ndarray!special methods!pos"
+
+\end_inset
+
+ (self)
+\end_layout
+
+\begin_layout Description
+__abs__
+\begin_inset LatexCommand index
+name "ndarray!special methods!abs"
+
+\end_inset
+
+ (self)
+\end_layout
+
+\begin_layout Description
+__invert__
+\begin_inset LatexCommand index
+name "ndarray!special methods!invert"
+
+\end_inset
+
+ (self)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ These functions are called in response to the unary operations (
+\family typewriter
+-
+\family default
+,
+\family typewriter
++
+\family default
+,
+\family typewriter
+abs()
+\family default
+,
+\family typewriter
+~
+\family default
+).
+ With the exception of __pos__, these are implemented using ufuncs (negative,
+ absolute, invert).
+ The unary
+\family typewriter
++
+\family default
+ operator, however simply calls self.copy(), and can therefore be used to
+ get a copy of an array.
+
+\end_layout
+
+\begin_layout Description
+__complex__
+\begin_inset LatexCommand index
+name "ndarray!special methods!complex"
+
+\end_inset
+
+ (self)
+\end_layout
+
+\begin_layout Description
+__int__
+\begin_inset LatexCommand index
+name "ndarray!special methods!int"
+
+\end_inset
+
+ (self)
+\end_layout
+
+\begin_layout Description
+__long__
+\begin_inset LatexCommand index
+name "ndarray!special methods!long"
+
+\end_inset
+
+ (self)
+\end_layout
+
+\begin_layout Description
+__float__
+\begin_inset LatexCommand index
+name "ndarray!special methods!float"
+
+\end_inset
+
+ (self)
+\end_layout
+
+\begin_layout Description
+__oct__
+\begin_inset LatexCommand index
+name "ndarray!special methods!oct"
+
+\end_inset
+
+ (self)
+\end_layout
+
+\begin_layout Description
+__hex__
+\begin_inset LatexCommand index
+name "ndarray!special methods!hex"
+
+\end_inset
+
+ (self)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ These functions are also defined for the
+\family typewriter
+ndarray
+\family default
+ object to handle the operations
+\family typewriter
+complex()
+\family default
+,
+\family typewriter
+int()
+\family default
+,
+\family typewriter
+long()
+\family default
+,
+\family typewriter
+float()
+\family default
+,
+\family typewriter
+oct()
+\family default
+, and
+\family typewriter
+hex()
+\family default
+.
+ They work only on arrays that have one element in them and return the appropria
+te scalar
+\begin_inset LatexCommand index
+name "ndarray!special methods|)"
+
+\end_inset
+
+.
+
+\end_layout
+
+\begin_layout Tip
+The function called to implement many arithmetic special methods for arrays
+ can be modified using the function set_numeric_ops.
+ This function is called with keyword arguments indicating which operation(s)
+ to replace.
+ A dictionary is returned containing showing the old functions.
+ By default, these functions are set to the corresponding ufunc.
+
+\end_layout
+
+\begin_layout Section
+Array indexing
+\end_layout
+
+\begin_layout Standard
+\begin_inset LatexCommand label
+name "sec:Array-indexing"
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+More powerful array
+\begin_inset LatexCommand index
+name "indexing|("
+
+\end_inset
+
+ indexing
+\begin_inset LatexCommand index
+name "ndarray!special methods!getitem"
+
+\end_inset
+
+ was an important extension introduced by numarray, and was therefore an
+ important part of the development of NumPy.
+ In particular, the desire to select arbitrary elements based on their position
+ in the array, and according to a mask was desirable.
+
+\end_layout
+
+\begin_layout Standard
+There are two kinds of indexing available using the
+\family typewriter
+X[obj]
+\family default
+ syntax: basic slicing, and advanced indexing
+\begin_inset LatexCommand index
+name "ndarray!special methods!setitem"
+
+\end_inset
+
+.
+ For the description of this syntax given below, X is the array to-be-sliced
+ and obj is the
+\emph on
+selection
+\emph default
+ object.
+ Furthermore, define
+\begin_inset Formula $N\equiv$
+\end_inset
+
+X.ndim.
+ These two methods of slicing have different behavior and are triggered
+ depending on obj.
+ Adding additional functionality yet remaining compatible with old uses
+ of slicing complicated the rules a little.
+ Hopefully, after studying this section, you will have a firm grasp of what
+ kind of selection will be initiated depending on the selection object.
+\end_layout
+
+\begin_layout Tip
+in Python X[(exp1, exp2, ..., expN)] is equivalent to X[exp1, exp2, ..., expN]
+ as the latter is just syntactic sugar for the former.
+\end_layout
+
+\begin_layout Subsection
+Basic Slicing
+\end_layout
+
+\begin_layout Standard
+Basic slicing
+\begin_inset LatexCommand index
+name "ndarray!special methods!getslice"
+
+\end_inset
+
+ extends Python's basic concept of slicing
+\begin_inset LatexCommand index
+name "ndarray!special methods!setslice"
+
+\end_inset
+
+ to N dimensions.
+ Basic slicing occurs when obj is a slice object (constructed by start:stop:step
+ notation inside of brackets), an integer, or a tuple of slice objects and
+ integers.
+ Ellipsis and newaxis objects can be interspersed with these as well.
+ In order to remain backward compatible with a common usage in Numeric,
+ basic slicing is also initiated if the selection object is any sequence
+ (such as a list) containing slice objects, the ellipsis
+\begin_inset LatexCommand index
+name "ellipsis"
+
+\end_inset
+
+ object, or the newaxis
+\begin_inset LatexCommand index
+name "newaxis"
+
+\end_inset
+
+ object, but no integer arrays or other embedded sequences.
+
+\end_layout
+
+\begin_layout Standard
+The standard rules of sequence slicing apply to basic slicing on a per-dimension
+ basis (including using a step index).
+ Some useful concepts to remember include:
+\end_layout
+
+\begin_layout Itemize
+The basic slice syntax is '
+\begin_inset Formula $i:j:k$
+\end_inset
+
+' where
+\begin_inset Formula $i$
+\end_inset
+
+ is the starting index,
+\begin_inset Formula $j$
+\end_inset
+
+ is the stopping index, and
+\begin_inset Formula $k$
+\end_inset
+
+ is the step (
+\begin_inset Formula $k\neq0$
+\end_inset
+
+).
+ This selects the
+\begin_inset Formula $m$
+\end_inset
+
+ elements (in the corresponding dimension) with index values
+\begin_inset Formula $i,\, i+k,\,\ldots,\, i+(m-1)k$
+\end_inset
+
+ where
+\begin_inset Formula $m=q+(r\neq0)$
+\end_inset
+
+ where
+\begin_inset Formula $q$
+\end_inset
+
+ and
+\begin_inset Formula $r$
+\end_inset
+
+ are the quotient and remainder obtained by dividing
+\begin_inset Formula $j-i$
+\end_inset
+
+ by
+\begin_inset Formula $k$
+\end_inset
+
+:
+\begin_inset Formula $j-i=qk+r$
+\end_inset
+
+, so that
+\begin_inset Formula $i+\left(m-1\right)k<j.$
+\end_inset
+
+
+\end_layout
+
+\begin_layout Itemize
+Assume
+\begin_inset Formula $n$
+\end_inset
+
+ is the number of elements in the dimension being sliced.
+ Then, if
+\begin_inset Formula $i$
+\end_inset
+
+ is not given it defaults to 0 for
+\begin_inset Formula $k>0$
+\end_inset
+
+ and
+\begin_inset Formula $n$
+\end_inset
+
+ for
+\begin_inset Formula $k<0$
+\end_inset
+
+.
+ If
+\begin_inset Formula $j$
+\end_inset
+
+ is not given it defaults to
+\begin_inset Formula $n$
+\end_inset
+
+ for
+\begin_inset Formula $k>0$
+\end_inset
+
+ and
+\begin_inset Formula $-1$
+\end_inset
+
+ for
+\begin_inset Formula $k<0$
+\end_inset
+
+.
+ If
+\begin_inset Formula $k$
+\end_inset
+
+ is not given it defaults to 1.
+ Note that '::' is the same as ':' and means select all indices along this
+ axis.
+
+\end_layout
+
+\begin_layout Itemize
+If the number of objects in the selection tuple is less than
+\begin_inset Formula $N$
+\end_inset
+
+, then ':' is assumed for any remaining dimensions.
+\end_layout
+
+\begin_layout Itemize
+Ellipsis expand to the number of ':' objects needed to make a selection
+ tuple of the same length as X.ndim.
+ Only one ellipsis is expanded, any others are interpreted as more ':'
+\end_layout
+
+\begin_layout Itemize
+Each newaxis object in the selection tuple serves to expand the dimensions
+ of the resulting selection by one unit-length dimension.
+ The added dimension is the position of the newaxis object in the selection
+ tuple.
+
+\end_layout
+
+\begin_layout Itemize
+An integer,
+\begin_inset Formula $i$
+\end_inset
+
+, returns the same values as
+\begin_inset Formula $i:i+1$
+\end_inset
+
+
+\series bold
+except
+\series default
+ the dimensionality of the returned object is reduced by 1.
+ In particular, a selection tuple with the
+\begin_inset Formula $p^{\textrm{th}}$
+\end_inset
+
+ element an integer (and all other entries ':') returns the corresponding
+ sub-array with dimension
+\begin_inset Formula $N-1$
+\end_inset
+
+.
+ If
+\begin_inset Formula $N=1,$
+\end_inset
+
+ then the returned object is an Array Scalar.
+ These objects are explained in Chapter
+\begin_inset LatexCommand ref
+reference "cha:Scalar-objects"
+
+\end_inset
+
+.
+\end_layout
+
+\begin_layout Itemize
+If the selection tuple has all entries ':' except the
+\begin_inset Formula $p^{\textrm{th}}$
+\end_inset
+
+ entry which is a slice object
+\begin_inset Formula $i:j:k$
+\end_inset
+
+, then the returned array has dimension
+\begin_inset Formula $N$
+\end_inset
+
+ formed by concatenating the sub-arrays returned by integer indexing of
+ elements
+\begin_inset Formula $i$
+\end_inset
+
+,
+\begin_inset Formula $i+k$
+\end_inset
+
+,
+\begin_inset Formula $i+(m-1)k<j$
+\end_inset
+
+,
+\end_layout
+
+\begin_layout Itemize
+Basic slicing with more than one non-':' entry in the slicing tuple, acts
+ like repeated application of slicing using a single non-':' entry, where
+ the non-':' entries are successively taken (with all other non-':' entries
+ replaced by ':').
+ Thus, X[ind1,...,ind2,:] acts like X[ind1][...,ind2,:] under basic slicing.
+ Note this is NOT true for advanced slicing.
+
+\end_layout
+
+\begin_layout Itemize
+You may use slicing to set values in the array, but (unlike lists) you can
+ never grow the array.
+ The size of the value to be set in X[obj] = value must be (broadcastable)
+ to the same shape as X[obj].
+
+\end_layout
+
+\begin_layout Standard
+Basic slicing always returns another
+\emph on
+view
+\begin_inset LatexCommand index
+name "ndarray!view"
+
+\end_inset
+
+
+\emph default
+ of the array.
+ In other words, the returned array from a basic slicing operation uses
+ the same data as the original array.
+ This can be confusing at first, but it is faster and can save memory.
+ A copy can always be obtained if needed using the unary + operator (which
+ has lower precedence than slicing) or the .copy() method.
+
+\end_layout
+
+\begin_layout Tip
+Remember that a slicing tuple can always be constructed as obj and used
+ in the x[obj] notation.
+ Slice objects can be used in the construction in place of the [start:stop:step]
+ notation.
+ For example,
+\family typewriter
+x[1:10:5,::-1]
+\family default
+ can also be implemented as
+\family typewriter
+obj=(slice(1,10,5), slice(None,None,-1)); X[obj]
+\family default
+.
+ This can be useful for constructing generic code that works on arrays of
+ arbitrary dimension.
+\end_layout
+
+\begin_layout Subsection
+Advanced selection
+\end_layout
+
+\begin_layout Standard
+Advanced selection is triggered when the selection object, obj, is a non-tuple
+ sequence object, an ndarray (of data type integer or bool), or a tuple
+ with at least one sequence object or ndarray (of data type integer or bool).
+ There are two types of advanced indexing: integer and Boolean.
+ Advanced selection always returns a copy of the data (contrast with basic
+ slicing that returns a view).
+
+\end_layout
+
+\begin_layout Subsubsection
+Integer
+\end_layout
+
+\begin_layout Standard
+Integer indexing allows selection of arbitrary items in the array based
+ on their
+\begin_inset Formula $N$
+\end_inset
+
+-dimensional index.
+ This kind of selection occurs when advanced selection is triggered and
+ the selection object is not an array of data type bool.
+ For the discussion below, when the selection object is not a tuple, it
+ will be referred to as if it had been promoted to a 1-tuple, which will
+ be called the selection tuple.
+ The rules of advanced integer-style indexing are:
+\end_layout
+
+\begin_layout Itemize
+if the length of the selection tuple is larger than
+\begin_inset Formula $N$
+\end_inset
+
+(=X.ndim) an error is raised.
+\end_layout
+
+\begin_layout Itemize
+all sequences and scalars in the selection tuple are converted to intp indexing
+ arrays.
+
+\end_layout
+
+\begin_layout Itemize
+all selection tuple objects must be convertible to intp arrays, or slice
+ objects, or the Ellipsis (...) object.
+\end_layout
+
+\begin_layout Itemize
+Exactly one Ellipsis object will be expanded, any other Ellipsis objects
+ will be treated as full slice (':') objects.
+ The Ellipsis object is replaced with as many full slice (':') objects as
+ needed to make the length of the selection tuple
+\begin_inset Formula $N$
+\end_inset
+
+.
+
+\end_layout
+
+\begin_layout Itemize
+If the selection tuple is smaller than
+\begin_inset Formula $N$
+\end_inset
+
+, then as many ':' objects as needed are added to the end of the selection
+ tuple so that the modified selection tuple has length
+\begin_inset Formula $N$
+\end_inset
+
+.
+\end_layout
+
+\begin_layout Itemize
+The shape of all the integer indexing arrays must be broadcastable to the
+ same shape.
+ Arrays are broadcastable if any of the following are satisfied
+\end_layout
+
+\begin_deeper
+\begin_layout Enumerate
+The arrays all have exactly the same shape.
+\end_layout
+
+\begin_layout Enumerate
+The arrays all have the same number of dimensions and the length of each
+ dimensions is either a common length or 1.
+\end_layout
+
+\begin_layout Enumerate
+The arrays that have too few dimensions can have their shapes pre-pended
+ with a dimension of length 1 to satisfy property 2.
+
+\end_layout
+
+\end_deeper
+\begin_layout Itemize
+The shape of the output (or the needed shape of the object to be used for
+ setting) is the broadcasted shape.
+
+\end_layout
+
+\begin_deeper
+\begin_layout Description
+Example: If a.shape is (5,1), b.shape is (1,6), c.shape is (6,) and d.shape
+ is () so that d is a scalar, then a, b, c, and d are all broadcastable
+ to dimension (5,6).
+ The array
+\begin_inset Quotes eld
+\end_inset
+
+a
+\begin_inset Quotes erd
+\end_inset
+
+ acts like a (5,6) array where a[:,0] is broadcast to the other columns,
+
+\begin_inset Quotes eld
+\end_inset
+
+b
+\begin_inset Quotes erd
+\end_inset
+
+ acts like a (5,6) array where b[0,:] is broadcast to the other rows,
+\begin_inset Quotes eld
+\end_inset
+
+c
+\begin_inset Quotes erd
+\end_inset
+
+ acts like a (1,6) array and therefore a (5,6) where c[:] is broadcast to
+ every row, and finally
+\begin_inset Quotes eld
+\end_inset
+
+d
+\begin_inset Quotes erd
+\end_inset
+
+ acts like a (5,6) array where the single values is repeated.
+
+\end_layout
+
+\end_deeper
+\begin_layout Itemize
+After expanding any ellipses and filling out any missing (':') objects in
+ the selection tuple, then let
+\begin_inset Formula $N_{t}$
+\end_inset
+
+ be the number of indexing arrays, and let
+\begin_inset Formula $N_{s}=N-N_{t}$
+\end_inset
+
+ be the number of slice objects.
+ Note that
+\begin_inset Formula $N_{t}>0$
+\end_inset
+
+ (or we wouldn't be doing advanced integer indexing).
+
+\end_layout
+
+\begin_layout Itemize
+If
+\begin_inset Formula $N_{s}=0$
+\end_inset
+
+ then the
+\begin_inset Formula $M$
+\end_inset
+
+-dimensional result is constructed by varying the index tuple
+\begin_inset Formula $\left(i_{1},\ldots,i_{M}\right)$
+\end_inset
+
+ over the range of the result shape and for each value of the index tuple
+ setting:
+\begin_inset Formula \[
+\textrm{result[$i_{1},\ldots,i_{M}$]=X[ind$_{1}$[$i_{1},\ldots i_{M}$], ind$_{2}$[$i_{1},\ldots,i_{M}$], \, etc.,\, ind$_{N}$[$i_{1},\ldots,i_{M}$]}.\]
+
+\end_inset
+
+
+\end_layout
+
+\begin_deeper
+\begin_layout Description
+Example: Suppose the shape of the broadcasted indexing arrays is 3-dimensional
+ and
+\begin_inset Formula $N$
+\end_inset
+
+ is 2.
+ Then the result is found by letting
+\begin_inset Formula $i,j,k$
+\end_inset
+
+ run over the shape found by broadcasting
+\begin_inset Formula $\textrm{ind}_{1},$
+\end_inset
+
+ and
+\begin_inset Formula $\textrm{ind}_{2},$
+\end_inset
+
+and for each
+\begin_inset Formula $i,j,k$
+\end_inset
+
+ setting result[
+\begin_inset Formula $i,j,k$
+\end_inset
+
+] = X[
+\begin_inset Formula $\textrm{ind}_{1}[i,j,k]$
+\end_inset
+
+,
+\begin_inset Formula $\textrm{ind}_{2}[i,j,k]$
+\end_inset
+
+].
+
+\end_layout
+
+\end_deeper
+\begin_layout Itemize
+If
+\begin_inset Formula $N_{s}>0$
+\end_inset
+
+, then partial indexing is done.
+ This can be somewhat mind-boggling to understand, but if you think in terms
+ of the shapes of the arrays involved, it can be easier to grasp what happens.
+ In simple cases (
+\emph on
+i.e.
+
+\emph default
+ one indexing array and
+\begin_inset Formula $N-1$
+\end_inset
+
+ slice objects) it does exactly what you would expect (concatenation of
+ repeated application of basic slicing).
+ The rule for partial indexing is that the shape of the result (or the interpret
+ed shape of the object to be used in setting) is the shape of X with the
+ indexed subspace replaced with the broadcasted indexing subspace.
+ If the index subspaces are right next to each other, then the broadcasted
+ indexing space directly replaces all of the indexed subspaces in X.
+ If the indexing subspaces are separated (by slice objects), then the broadcaste
+d indexing space is first, followed by the sliced subspace of X.
+
+\end_layout
+
+\begin_deeper
+\begin_layout Description
+Example\InsetSpace ~
+1: Suppose X.shape is (10,20,30) and ind is a (2,3,4) indexing intp
+ array, then result=X[...,ind,:] has shape (10,2,3,4,30) because the (20,)-shaped
+ subspace has been replaced with a (2,3,4)-shaped broadcasted indexing subspace.
+ If we let
+\begin_inset Formula $i,j,k$
+\end_inset
+
+ loop over the (2,3,4)-shaped subspace then result[...,i,j,k,:] = X[...,ind[i,j,k],:].
+ This example produces the same result as X.take(ind,axis=-2).
+
+\end_layout
+
+\begin_layout Description
+Example\InsetSpace ~
+2: Now let X.shape be (10,20,30,40,50) and suppose
+\begin_inset Formula $\textrm{ind}_{1}$
+\end_inset
+
+ and
+\begin_inset Formula $\textrm{ind}_{2}$
+\end_inset
+
+ are broadcastable to the shape (2,3,4).
+ Then X[:,ind
+\begin_inset Formula $_{1}$
+\end_inset
+
+,ind
+\begin_inset Formula $_{2}$
+\end_inset
+
+] has shape (10,2,3,4,40,50) because the (20,30)-shaped subspace from X
+ has been replaced with the (2,3,4) subspace from the indices.
+ However, X[:,ind
+\begin_inset Formula $_{1}$
+\end_inset
+
+,:,ind
+\begin_inset Formula $_{2}$
+\end_inset
+
+,:] has shape (2,3,4,10,30,50) because there is no unambiguous place to
+ drop in the indexing subspace, thus it is tacked-on to the beginning.
+ It is always possible to use .transpose() to move the sups pace anywhere
+ desired.
+ This example cannot be replicated using take.
+
+\end_layout
+
+\end_deeper
+\begin_layout Subsubsection
+Boolean
+\end_layout
+
+\begin_layout Standard
+This advanced selection occurs when obj is an array object of Boolean type
+ (such as may be returned from comparison operators).
+ It is always equivalent to (but faster than) X[obj.nonzero()] where as described
+ above obj.nonzero() returns a tuple (of length obj.ndim) of integer index
+ arrays showing the True elements of obj.
+
+\end_layout
+
+\begin_layout Standard
+The special case when obj.ndim == X.ndim is worth mentioning.
+ In this case X[obj] returns a 1-dimensional array filled with the elements
+ of X corresponding to the True values of obj.
+ It The search order will be C-style (last index varies the fastest).
+ If obj has True values at entries that are outside of the bounds of X,
+ then an index error will be raised.
+\end_layout
+
+\begin_layout Standard
+You can also use Boolean arrays as element of the selection tuple.
+ In such instances, they will always be interpreted as nonzero(obj) and
+ the equivalent integer indexing will be done.
+ In general you can think of indexing with Boolean arrays as indexing with
+ nonzero(<Boolean>).
+\end_layout
+
+\begin_layout Warning
+the definition of advanced selection means that X[(1,2,3),] is fundamentally
+ different than X[(1,2,3)].
+ The latter is equivalent to X[1,2,3] which will trigger basic selection
+ while the former will trigger advanced selection.
+ Be sure to understand why this is True.
+ You should also recognize that x[[1,2,3]] will trigger advanced selection,
+ but X[[1,2,slice(None)]] will trigger basic selection.
+\end_layout
+
+\begin_layout Subsection
+Flat Iterator indexing
+\end_layout
+
+\begin_layout Standard
+As mentioned previously, X.flat returns an iterator that will iterate over
+ the entire array (in C-contiguous style with the last index varying the
+ fastest).
+ This iterator object can also be indexed using basic slicing or advanced
+ indexing as long as the selection object is not a tuple.
+ This should be clear from the fact that X.flat is a 1-dimensional view.
+ X.flat can be used for integer indexing using 1-dimensional C-style-flat
+ indices.
+ The shape of any returned array is therefore the shape of the integer indexing
+\begin_inset LatexCommand index
+name "indexing|)"
+
+\end_inset
+
+ object
+\begin_inset LatexCommand index
+name "ndarray|)"
+
+\end_inset
+
+.
+
+\end_layout
+
+\begin_layout Chapter
+Basic Routines
+\end_layout
+
+\begin_layout Quotation
+Do not pray for tasks equal to your powers; pray for powers equal to your
+ tasks.
+ Then the doing of your work shall be no miracle, but you shall be the miracle.
+\end_layout
+
+\begin_layout Right Address
+---
+\emph on
+Phillips Brooks
+\end_layout
+
+\begin_layout Quote
+Education isn't how much you have committed to memory, or even how much
+ you know.
+ It's being able to differentiate between what you do know and what you
+ don't.
+\end_layout
+
+\begin_layout Right Address
+---
+\emph on
+Anatole France
+\end_layout
+
+\begin_layout Section
+Creating arrays
+\end_layout
+
+\begin_layout Description
+array
+\begin_inset LatexCommand index
+name "array"
+
+\end_inset
+
+ (object=, dtype=None, copy=True, order=None, subok=False, ndmin=0)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Create a new ndarray of data type, dtype (or determined from object if
+ dtype is None).
+ The shape of the new array will be determined from object.
+ If copy is True, then ensure a copy of the object is made.
+ If copy is False, then the returned object is a copy of the array only
+ if dtype is not equivalent to the data type of object.
+ If order is 'Fortran' then the resulting array will be in Fortran order,
+ otherwise it is in C order.
+ If subok (subclasses are O.K.) is True then pass through subclasses of the
+ array object if possible.
+ If subok is False then only ndarray objects may be returned.
+ The ndmin parameter specifies that the returned array must have at least
+ the given number of dimensions.
+
+\end_layout
+
+\begin_layout Description
+asarray
+\begin_inset LatexCommand index
+name "asarray"
+
+\end_inset
+
+ (object=, dtype=None, order=None)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Exactly the same as array(...) except the default copy argument is False,
+ and subok is always False.
+ Using this function always returns the base class ndarray.
+
+\end_layout
+
+\begin_layout Description
+asanyarray
+\begin_inset LatexCommand index
+name "asanyarray"
+
+\end_inset
+
+ (object, dtype=None, order=None)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Thin wrapper around array(...) with subok=1.
+ You should use this routine if you are only making use of the array attributes,
+ and believe the calculations that will follow would work with any subclass
+ of the array.
+ Use of this routine increases the chance that array subclasses will interact
+ seamlessly with your function --- returning the same subclasses.
+
+\end_layout
+
+\begin_layout Description
+require
+\begin_inset LatexCommand index
+name "require"
+
+\end_inset
+
+ (object, dtype=None, requirements=None)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Require a Python object to be an ndarray (or a sub-class) of the given
+ data-type if it can be cast safely, otherwise raise an error.
+ The requirements, if given, are a sequence containing the requested combination
+ of the flags 'C_CONTIGUOUS' ('C'), 'F_CONTIGUOUS' ('F'), 'ALIGNED' ('A'),
+ 'WRITEABLE' ('W'), 'OWNDATA' ('O'), and the special directive 'ENSUREARRAY'
+ ('E').
+ These strings dictate which flags should be set on the return array (note
+ only one of 'F_CONTIGUOUS' or 'C_CONTIGUOUS' should be used and 'F_CONTIGUOUS'
+ over-rides 'C_CONTIGUOUS').
+ The special directive 'ENSUREARRAY' makes sure that a base-class ndarray
+ is returned instead of allowing sub-classes to pass through.
+ This function is particularly useful in a Python interface to C-code (say
+ called using ctypes
+\begin_inset LatexCommand index
+name "ctypes"
+
+\end_inset
+
+).
+
+\end_layout
+
+\begin_layout Description
+arange
+\begin_inset LatexCommand index
+name "arange"
+
+\end_inset
+
+ (start=, stop=None, step=1, dtype=None)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Function similar to Python's built-in range() function except it returns
+ an ndarray object.
+ Return a 1-d array of data type, dtype (or determined from the start, stop,
+ and step objects if None), that starts at start, ends
+\emph on
+before
+\emph default
+ stop and is incremented by step.
+ The returned array has length
+\begin_inset Formula $n$
+\end_inset
+
+ where
+\begin_inset Formula \[
+n=\left\lceil \frac{\textrm{stop}-\textrm{start}}{\textrm{step}}\right\rceil \]
+
+\end_inset
+
+ with element
+\begin_inset Formula $i$
+\end_inset
+
+ equal to
+\begin_inset Formula $\textrm{start}+i\cdot\textrm{step}.$
+\end_inset
+
+ If stop is None, then the first argument is interpreted as stop and start
+ is 0.
+
+\end_layout
+
+\begin_layout Note
+By definition of the ceiling function (denoted by
+\begin_inset Formula $\left\lceil x\right\rceil $
+\end_inset
+
+), we know that
+\begin_inset Formula $x\leq\left\lceil x\right\rceil <x+1$
+\end_inset
+
+, therefore this definition of the length of arange guarantees that
+\begin_inset Formula $\textrm{start}+n\cdot\textrm{step}\geq\textrm{stop}$
+\end_inset
+
+ as well as
+\begin_inset Formula $\textrm{start}+(n-1)\cdot\textrm{step}<\textrm{stop}$
+\end_inset
+
+.
+
+\end_layout
+
+\begin_layout Description
+isfortran
+\begin_inset LatexCommand index
+name "isfortran"
+
+\end_inset
+
+ (arr)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Equivalent to
+\family typewriter
+arr.flags.fnc
+\family default
+ and therefore returns True only if arr is Fortran-contiguous but not also
+ C-contiguous.
+\end_layout
+
+\begin_layout Description
+empty
+\begin_inset LatexCommand index
+name "empty"
+
+\end_inset
+
+ (shape=, dtype=int, order='C')
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Return an uninitialized array of data type, dtype, and given shape.
+ The memory layout defaults to C-style contiguous, but can be made Fortran-style
+ contiguous with a 'Fortran' order keyword.
+\end_layout
+
+\begin_layout Description
+empty_like
+\begin_inset LatexCommand index
+name "empty\\_like"
+
+\end_inset
+
+ (arr)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Syntactic sugar for empty(a.shape, a.dtype, isfortran(arr))
+\end_layout
+
+\begin_layout Description
+zeros
+\begin_inset LatexCommand index
+name "zeros"
+
+\end_inset
+
+ (shape=, dtype=int, order='C')
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Return an array of data type dtype and given shape filled with zeros.
+ The memory layout may be altered from the default C-style contiguous with
+ the order keyword.
+\end_layout
+
+\begin_layout Description
+zeros_like
+\begin_inset LatexCommand index
+name "zeros\\_like"
+
+\end_inset
+
+ (arr)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Syntactic sugar for zeros(a.shape, a.dtype, isfortran(arr))
+\end_layout
+
+\begin_layout Description
+ones
+\begin_inset LatexCommand index
+name "ones"
+
+\end_inset
+
+ (shape=, dtype=int, order='C')
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Syntactic sugar for a = zeros(shape, dtype, order); a+= 1.
+
+\end_layout
+
+\begin_layout Description
+fromstring
+\begin_inset LatexCommand index
+name "fromstring"
+
+\end_inset
+
+ (string=,dtype=int, count=-1, sep='')
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ If sep is '', then return a new 1-d array with data-type descriptor given
+ by dtype and with memory initialized (copied) from the raw binary data
+ in string.
+ If count is non-negative, the new array will have count elements (with
+ a
+\family typewriter
+ValueError
+\family default
+ raised if count requires more data than the string offers), otherwise the
+ size of the string must be a multiple of the itemsize implied by dtype,
+ and count will be the length of the string divided by the itemsize.
+
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ If sep is not '', then interpret the string in ASCII mode with the provided
+ separator and convert the string to an array of numbers.
+ Any additional white-space will be ignored.
+\end_layout
+
+\begin_layout Description
+fromfile
+\begin_inset LatexCommand index
+name "fromfile"
+
+\end_inset
+
+ (file=, dtype=int, count=-1, sep='')
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Return a 1-d array of data type, dtype, from a file (open file object or
+ string with the name of a file to read).
+ The file will be read in binary mode if sep is the empty string.
+ Otherwise, the file will be read in text mode with sep providing the separator
+ string between the entries.
+ If count is -1, then the size will be determined from the file, otherwise,
+ up to count items will be read from the file.
+ If fewer than count items are read, then a RunTimeWarning is issued indicating
+ the number of items read.
+\end_layout
+
+\begin_layout Description
+frombuffer
+\begin_inset LatexCommand index
+name "frombuffer"
+
+\end_inset
+
+ (buffer, dtype=intp, count=-1, offset=0)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Very similar to (binary-mode) fromstring in interpretation of the arguments,
+ except buffer can be any object exposing the buffer interface (or any object
+ with a __buffer__ attribute that returns a buffer exposing the buffer protocol).
+ The new array shares memory with the buffer object.
+ The new array will be read-only if the buffer does not expose a writeable
+ buffer.
+
+\end_layout
+
+\begin_layout Description
+fromiter
+\begin_inset LatexCommand index
+name "fromiter"
+
+\end_inset
+
+ (iterator_or_generator, dtype=None)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Construct an array from an iterator or a generator.
+ Only handles 1-dimensional cases.
+ By default the data-type is determined from the objects returned from the
+ iterator.
+
+\end_layout
+
+\begin_layout Description
+load
+\begin_inset LatexCommand index
+name "load"
+
+\end_inset
+
+ (file)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Load a NumPy binary file (.npy), a NumPy binary zipfile (.npz), or a pickled
+ Python object from an open file.
+ If file is a string, then open a file with that name first.
+ Which kind of file should be loaded is determined by the magic bytes at
+ the front of the file (not by filename extension).
+ See
+\shape italic
+save
+\shape default
+ and
+\shape italic
+savez
+\shape default
+ for functions which write .npy and .npz files from NumPy arrays.
+ If file is a binary zipfile, then an instance of NpzObj is returned.
+ This object is a simple wrapper around the zip-file which allows extraction
+ of the arrays stored within it.
+ The .files attribute of the NpzObj returns a list of all arrays in the archive.
+ These arrays are accessible through a dictionary-like interface (obj['name'])
+ or through attribute lookup through the .f attribute of the returned object
+ (obj.f.name).
+ If the file is a NumPy binary file (.npy), then the array itself is returned
+ from this function.
+ If the file contains a pickled object, then that object is returned.
+
+\end_layout
+
+\begin_layout Description
+loads
+\begin_inset LatexCommand index
+name "loads"
+
+\end_inset
+
+ (str)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Load a pickled array from a string.
+ Equivalent to cPickle.loads(str).
+ This function will likely be deprecated in the future.
+ Use cPickle instead.
+\end_layout
+
+\begin_layout Description
+save
+\begin_inset LatexCommand index
+name "save"
+
+\end_inset
+
+ (file, arr)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Save the array into a file which can be a string or an open file-like object.
+ If the file is given as a string, then it will have .npy appended if it
+ does not already end with that extension.
+ The .npy file format is NumPy-specific and is documented in the numpy.lib.format
+ module.
+ It only stores a single array.
+
+\end_layout
+
+\begin_layout Description
+savez
+\begin_inset LatexCommand index
+name "savez"
+
+\end_inset
+
+ (file, *args, **kwds)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Save a sequence of arrays into a NumPy binary zipfile (.npz).
+ An .npz file is a regular zip-file containing multiple .npy files.
+ If keywords are given, then the keyword names are used as filenames (with
+ the .npy extension added) in the zip-file with the corresponding values
+ being converted to arrays and stored in the specified filename.
+ Any non-keyword arguments that are passed in results in the names arr_0,
+ arr_1, etc.
+ being used in the zip-file (if a keyword by one of those names also exists,
+ then a ValueError is raised).
+
+\end_layout
+
+\begin_layout Description
+loadtxt
+\end_layout
+
+\begin_layout Description
+savetxt
+\end_layout
+
+\begin_layout Description
+DataSource
+\end_layout
+
+\begin_layout Description
+indices
+\begin_inset LatexCommand index
+name "indices"
+
+\end_inset
+
+ (dimensions, dtype=intp)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Return an array of dtype representing
+\begin_inset Formula $n$
+\end_inset
+
+(=len(dimensions)) grids of indices each with variation in a single direction.
+ The returned array has shape (
+\begin_inset Formula $n$
+\end_inset
+
+,)+dimensions.
+ Compare with mgrid.
+
+\end_layout
+
+\begin_layout MyCode
+>>> indices((2,3))
+\newline
+array([[[0, 0, 0],
+\newline
+ [1, 1, 1]],
+\newline
+
+\newline
+ [[0, 1, 2],
+\newline
+
+ [0, 1, 2]]])
+\end_layout
+
+\begin_layout Description
+fromfunction
+\begin_inset LatexCommand index
+name "fromfunction"
+
+\end_inset
+
+ (function, dimensions, **kwargs)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Construct an array from a function called on a tuple of index grids.
+ The function should be able to take array arguments and process them like
+ ufuncs (use vectorize if it doesn't).
+ The function should accept as many arguments as there are dimensions which
+ is a sequence of numbers indicating the length of the desired output for
+ each axis.
+ Keyword arguments to function may also be passed in as keywords to fromfunction.
+\end_layout
+
+\begin_layout MyCode
+>>> print fromfunction(lambda i,j: i+j, (2,3))
+\newline
+[[ 0.
+ 1.
+ 2.]
+\newline
+ [ 1.
+ 2.
+ 3.]]
+\end_layout
+
+\begin_layout Description
+identity
+\begin_inset LatexCommand index
+name "identity"
+
+\end_inset
+
+ (n, dtype=intp)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Return a 2-d array of shape (n,n) and data type, dtype with ones along
+ the main diagonal.
+
+\end_layout
+
+\begin_layout Description
+where
+\begin_inset LatexCommand index
+name "where"
+
+\end_inset
+
+ (condition[, x, y])
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Returns an array shaped like condition, that has the elements of x and
+ y respectively where condition is respectively true or false.
+ If x and y are not given, then it is equivalent to nonzero(condition).
+\end_layout
+
+\begin_layout Description
+flatnonzero
+\begin_inset LatexCommand index
+name "flatnonzero"
+
+\end_inset
+
+ (arr)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Return indices that are non-zero in a flattened version of arr.
+ Equivalent to a.ravel().nonzero()[0].
+\end_layout
+
+\begin_layout Description
+putmask
+\begin_inset LatexCommand index
+name "putmask"
+
+\end_inset
+
+ (arr=, mask=, values=)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Performs the equivalent of
+\end_layout
+
+\begin_layout LyX-Code
+for n, obj in enumerate(
+\series bold
+mask
+\series default
+.flat):
+\end_layout
+
+\begin_layout LyX-Code
+ if obj:
+\end_layout
+
+\begin_layout LyX-Code
+ self.flat[n] =
+\series bold
+values
+\series default
+[n]
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ The values array is repeated if it is too short.
+ In particular, this means that indexing on the values array is modular
+ it's length, which might be surprising you are expecting putmask to work
+ the same as arr[mask]=values.
+\end_layout
+
+\begin_layout Description
+lexsort
+\begin_inset LatexCommand index
+name "lexsort"
+
+\end_inset
+
+ (keys=, axis=-1)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Return an array of indices similar to argsort except sorting is done using
+ all of the provided keys.
+ First a sort is computed using key[0], then the indices are further altered
+ by sorting on key[1].
+ This is repeated until sorting has been performed on all of the keys.
+ This is a useful function for multiple-field sorting.
+\end_layout
+
+\begin_layout MyCode
+>>> a = [1,2,1,3,1,5]; b = [0,4,5,6,2,3]
+\newline
+>>> ind = lexsort((b,a))
+\newline
+>>> print
+ take(a,ind)
+\newline
+[1 1 1 2 3 5]
+\newline
+>>> print take(b,ind)
+\newline
+[0 2 5 4 6 3]
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Notice the order the keys had to be used in order to get a lexicographical
+ sorting order.
+ To clarify, suppose three equal-length sequences are fields of an underlying
+ data-type: (f1,f2,f3).
+ If we want to sort first on f1 and then on f2 and then on f3, the indices
+ that would accomplish that sort are obtained as lexsort((f3,f2,f1)).
+\end_layout
+
+\begin_layout Section
+Operations on two or more arrays
+\end_layout
+
+\begin_layout Description
+concatenate
+\begin_inset LatexCommand index
+name "concatenate"
+
+\end_inset
+
+ (seq=, axis=0)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Construct a new array from elements of the sequence object seq concatenated
+ along the given axis.
+ The elements of the sequence object must have compatible types and be the
+ same shape.
+ If axis is None, then flatten each element of seq before concatenating
+ together to construct a 1-d array.
+\end_layout
+
+\begin_layout Description
+correlate
+\begin_inset LatexCommand index
+name "correlate"
+
+\end_inset
+
+ (x, y, mode='valid')
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Compute the 1-d cross correlation of x and y keeping portions determined
+ by mode which may be 'valid' (0), 'same' (1), or 'full' (2).
+ The 'full' cross-correlation between two 1-d arrays is computed as
+\begin_inset Formula \[
+z\left[n\right]=\sum_{i=\max\left(n-M,0\right)}^{\min\left(n,K\right)}x\left[i\right]y\left[n+i\right],\]
+
+\end_inset
+
+for
+\begin_inset Formula $n=0\ldots K+M$
+\end_inset
+
+ where
+\begin_inset Formula $K$
+\end_inset
+
+=len(
+\begin_inset Formula $x$
+\end_inset
+
+)-1 and
+\begin_inset Formula $M$
+\end_inset
+
+=len(
+\begin_inset Formula $y$
+\end_inset
+
+)-1, and we assume
+\begin_inset Formula $K\geq M$
+\end_inset
+
+ (without loss of generality because we can interchange the roles of
+\begin_inset Formula $x$
+\end_inset
+
+ and
+\begin_inset Formula $y$
+\end_inset
+
+ without effect).
+ For this formula to work, we assume that
+\begin_inset Formula $x[i]=0$
+\end_inset
+
+ when
+\begin_inset Formula $i\notin\left[0,K-1\right]$
+\end_inset
+
+ and
+\begin_inset Formula $y[j]=0$
+\end_inset
+
+ when
+\begin_inset Formula $j\neq[0,M-1]$
+\end_inset
+
+.
+
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ If mode is 'same' then only the
+\begin_inset Formula $K$
+\end_inset
+
+ middle values are returned starting at
+\begin_inset Formula $n=\left\lfloor \frac{M-1}{2}\right\rfloor $
+\end_inset
+
+.
+ If the flag has a value of 'valid' then only the middle
+\begin_inset Formula $K-M+1=\left(K+1\right)-\left(M+1\right)+1$
+\end_inset
+
+ output values are returned starting at
+\begin_inset Formula $n=M.$
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+convolve
+\begin_inset LatexCommand index
+name "convolve"
+
+\end_inset
+
+ (x, y, mode='valid')
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Convolution is very similar to correlation except it is defined with one
+ sequence reversed:
+\begin_inset Formula \[
+z\left[n\right]=\sum_{i}x[i]y[n-i].\]
+
+\end_inset
+
+ The mode keyword has the same effect as it does for correlation.
+ Convolution ('full') between two 1-d arrays implements polynomial multiplicatio
+n where the array entries are viewed as coefficients for polynomials.
+\end_layout
+
+\begin_deeper
+\begin_layout Description
+Example: Consider that
+\begin_inset Formula $(x^{3}+4x^{2}+2)$
+\end_inset
+
+
+\begin_inset Formula $\left(x^{4}+3x+1\right)$
+\end_inset
+
+=
+\begin_inset Formula $x^{7}+4x^{6}+5x^{4}+13x^{3}+4x^{2}+6x+2.$
+\end_inset
+
+ This can be determined by using the code
+\family typewriter
+convolve([1,4,0,2], [1,0,0,3,1])
+\family default
+ which returns
+\family typewriter
+[1,4,0,5,13,4,6,2].
+
+\family default
+ Notice the one-to-one alignment between the elements of the arrays and
+ the coefficients on powers of
+\begin_inset Formula $x$
+\end_inset
+
+ in the polynomial.
+
+\end_layout
+
+\end_deeper
+\begin_layout Description
+outer
+\begin_inset LatexCommand index
+name "outer"
+
+\end_inset
+
+ (a, b)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ compute an outerproduct which is syntactic sugar for a.ravel() [:,newaxis]
+ * b.ravel() [newaxis,:] (after first converting a and b to ndarrays).
+\end_layout
+
+\begin_layout MyCode
+>>> print outer([1,2,3],[10,100,1000])
+\newline
+[[ 10 100 1000]
+\newline
+ [ 20 200 2000]
+\newline
+
+ [ 30 300 3000]]
+\end_layout
+
+\begin_layout Description
+inner
+\begin_inset LatexCommand index
+name "inner"
+
+\end_inset
+
+ (a, b)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Computes the inner product between two arrays.
+ This is an array that has shape a.shape[:-1] + b.shape[:-1] with elements
+ computed as the sum of the product of the elements from the last dimensions
+ of a and b.
+ In particular, let
+\begin_inset Formula $I$
+\end_inset
+
+ and
+\begin_inset Formula $J$
+\end_inset
+
+ be the super
+\begin_inset Foot
+status open
+
+\begin_layout Standard
+A super index is 0 or more integer indices used to index into an N-dimensional
+ array.
+ How many indices a super index represents should be implied by context.
+\end_layout
+
+\end_inset
+
+ indices selecting the 1-dimensional arrays
+\begin_inset Formula $a[I,:]$
+\end_inset
+
+ and
+\begin_inset Formula $b[J,:]$
+\end_inset
+
+, then the resulting array,
+\begin_inset Formula $r$
+\end_inset
+
+, is
+\begin_inset Formula \[
+r[I,J]=\sum_{k}a[I,k]b[J,k].\]
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+dot
+\begin_inset LatexCommand index
+name "dot"
+
+\end_inset
+
+ (a, b)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Computes the dot (matrix) product between two arrays.
+ The product-sum is over the last dimension of
+\begin_inset Formula $a$
+\end_inset
+
+ and the second-to-last dimension of
+\begin_inset Formula $b$
+\end_inset
+
+.
+ Specifically, if
+\begin_inset Formula $I$
+\end_inset
+
+ and
+\begin_inset Formula $J$
+\end_inset
+
+ are super indices for
+\begin_inset Formula $a[I,:]$
+\end_inset
+
+ and
+\begin_inset Formula $b[J,:,j]$
+\end_inset
+
+ so that
+\begin_inset Formula $j$
+\end_inset
+
+ is the index of the last dimension of
+\begin_inset Formula $b$
+\end_inset
+
+.
+ Then, the shape of the resulting array is a.shape[:-1] + b.shape[:-2] + (b.shape[-
+1],) with elements.
+
+\begin_inset Formula \[
+r[I,J,j]=\sum_{k}a[I,k]b[J,k,j],\]
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+\begin_inset LatexCommand index
+name "vdot"
+
+\end_inset
+
+vdot (a, b)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Computes the dot product between two arrays (flattened into one-dimensional
+ vectors) after conjugating the first vector.
+ This is an inner-product following the physicists convention of conjugating
+ the first argument.
+\begin_inset Formula \[
+r=\sum_{k}\overline{\textrm{a.flat}[k]}\textrm{b.flat}[k].\]
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+tensordot
+\begin_inset LatexCommand index
+name "tensordot"
+
+\end_inset
+
+ (a, b, axes=(-1,0))
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Computes a dot-product between two arrays where the sum is taken over the
+ axes specified by the 2-sequence which can have either scalar or sequence
+ entries.
+ The axes specified are summed over and the remaining axes are used to construct
+ the result.
+ So, for example, if
+\begin_inset Formula $a$
+\end_inset
+
+ is
+\begin_inset Formula $3\times4\times5$
+\end_inset
+
+ and
+\begin_inset Formula $b$
+\end_inset
+
+ is
+\begin_inset Formula $4\times3\times2$
+\end_inset
+
+ then if axes=([1,0],[0,1]) (or axes=([0,1],[1,0])) the result will be
+\begin_inset Formula $5\times2$
+\end_inset
+
+.
+ Let
+\begin_inset Formula $I$
+\end_inset
+
+ represent the indices of the un-summed axes in
+\begin_inset Formula $a$
+\end_inset
+
+, let
+\begin_inset Formula $J$
+\end_inset
+
+ represent the indices of the un-summed axes in
+\begin_inset Formula $b$
+\end_inset
+
+ and let
+\begin_inset Formula $K$
+\end_inset
+
+ represent the the indices of the axes summed over in both
+\begin_inset Formula $a$
+\end_inset
+
+ and
+\begin_inset Formula $b$
+\end_inset
+
+.
+ Also, let
+\begin_inset Formula $a_{t}$
+\end_inset
+
+ represent a transposed version of
+\begin_inset Formula $a$
+\end_inset
+
+ where the axes to be summed over are pushed to the end, and let
+\begin_inset Formula $b_{t}$
+\end_inset
+
+ represent a transposed version of
+\begin_inset Formula $b$
+\end_inset
+
+ where the axes to be summed over are pushed to the front.
+ Then, using
+\begin_inset Formula $\sum_{K}$
+\end_inset
+
+ to represent a multi-index sum, the result can be written as
+\end_layout
+
+\begin_layout Standard
+\begin_inset Formula \[
+r[I,J]=\sum_{K}a_{t}[I,K]b_{t}[K,J]\]
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+cross
+\begin_inset LatexCommand index
+name "cross"
+
+\end_inset
+
+ (a, b, axisa=-1, axisb=-1, axisc=-1, axis=None)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Returns the cross product of two (arrays of) vectors.
+ The cross product is performed over the axes of the input arrays indicated
+ by the axisa, and axisb arguments.
+ For both arrays, the axis used must have dimension either 2 or 3.
+ If both axes used have dimension 2, then only the z-component of the equivalent
+ 3-d cross product is returned.
+ Otherwise, the entire vector is returned.
+ The axisc argument gives the axis of the vectors in the returned cross-product
+ result.
+ If axis is not None, then it is assumed that axisa=axisb=axisc=axis (regardless
+ of what else is specified).
+
+\end_layout
+
+\begin_layout Description
+allclose
+\begin_inset LatexCommand index
+name "allclose"
+
+\end_inset
+
+ (a, b, rtol=
+\begin_inset Formula $10^{-5}$
+\end_inset
+
+, atol=
+\begin_inset Formula $10^{-8}$
+\end_inset
+
+)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Returns true if all components of a and b are equal subject to the given
+ relative and absolute tolerances.
+ This returns true if every element of a and b satisfy
+\begin_inset Formula \[
+\left|a-b\right|<\textrm{atol}+\textrm{rtol}\left|b\right|.\]
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Section
+Printing arrays
+\end_layout
+
+\begin_layout Description
+array2string
+\begin_inset LatexCommand index
+name "array2string"
+
+\end_inset
+
+ (a)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ The default printing mechanism uses this function to produce a string from
+ an array.
+
+\end_layout
+
+\begin_layout Description
+set_printoptions
+\begin_inset LatexCommand index
+name "set\\_printoptions"
+
+\end_inset
+
+ (precision=None, theshold=None, edgeitems=None, linewidth=None, suppress=None)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Set options associated with representing an array.
+\end_layout
+
+\begin_deeper
+\begin_layout Description
+precision the default number of digits of precision for floating point output
+ (default 8);
+\end_layout
+
+\begin_layout Description
+threshold total number of array elements which triggers printing only the
+
+\begin_inset Quotes eld
+\end_inset
+
+ends
+\begin_inset Quotes erd
+\end_inset
+
+ of the array rather than a full representation (default 1000);
+\end_layout
+
+\begin_layout Description
+edgeitems number of array elements in summary at beginning and end of each
+ dimension (default 3);
+\end_layout
+
+\begin_layout Description
+linewidth the number of characters per line (default 75);
+\end_layout
+
+\begin_layout Description
+suppress Boolean value indicating whether or not to suppress printing of
+ small floating point values using scientific notation (default False).
+\end_layout
+
+\end_deeper
+\begin_layout Description
+get_printoptions
+\begin_inset LatexCommand index
+name "get\\_printoptions"
+
+\end_inset
+
+ ()
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Returns the values of precision, threshold, edgeitems, linewidth, and suppress
+ that control printing of arrays.
+\end_layout
+
+\begin_layout Description
+set_string_function
+\begin_inset LatexCommand index
+name "set\\_string\\_function"
+
+\end_inset
+
+ (func, repr=1)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Set the function to use in response to str(array) or repr(array).
+ By default this function is array2string.
+ The function passed in must take an array argument and return a string.
+ If func is None, then the print function is reset to a simple internal
+ function.
+
+\end_layout
+
+\begin_layout Section
+Functions redundant with methods
+\end_layout
+
+\begin_layout Standard
+Several functions are available primarily for purposes of backward compatibility
+ with old Numeric, and are therefore redundant.
+ The functions are all simple wrappers for asarray(a).<function>(*args, **kwds),
+ or are replaceable by attribute access.
+ The following list documents them.
+ It is not recommended that these functions be used in new programs, but
+ there are no plans for removing them as in functional form they work with
+ arbitrary sequences which is sometimes desirable.
+ The functions that mirror methods and attributes are:
+\series bold
+take
+\series default
+
+\begin_inset LatexCommand index
+name "take"
+
+\end_inset
+
+,
+\series bold
+reshape
+\series default
+
+\begin_inset LatexCommand index
+name "reshape"
+
+\end_inset
+
+,
+\series bold
+squeeze
+\series default
+
+\begin_inset LatexCommand index
+name "squeeze"
+
+\end_inset
+
+,
+\series bold
+choose
+\series default
+
+\begin_inset LatexCommand index
+name "choose"
+
+\end_inset
+
+,
+\series bold
+repeat
+\series default
+
+\begin_inset LatexCommand index
+name "repeat"
+
+\end_inset
+
+,
+\series bold
+put
+\series default
+
+\begin_inset LatexCommand index
+name "put"
+
+\end_inset
+
+,
+\series bold
+swapaxes
+\series default
+
+\begin_inset LatexCommand index
+name "swapaxes"
+
+\end_inset
+
+,
+\series bold
+transpose
+\series default
+
+\begin_inset LatexCommand index
+name "transpose"
+
+\end_inset
+
+,
+\series bold
+real
+\series default
+
+\begin_inset LatexCommand index
+name "real"
+
+\end_inset
+
+,
+\series bold
+imag
+\series default
+
+\begin_inset LatexCommand index
+name "imag"
+
+\end_inset
+
+,
+\series bold
+sort
+\series default
+
+\begin_inset LatexCommand index
+name "sort"
+
+\end_inset
+
+,
+\series bold
+argsort
+\series default
+
+\begin_inset LatexCommand index
+name "argsort"
+
+\end_inset
+
+,
+\series bold
+amax
+\begin_inset LatexCommand index
+name "amax"
+
+\end_inset
+
+, argmax
+\series default
+
+\begin_inset LatexCommand index
+name "argmax"
+
+\end_inset
+
+,
+\series bold
+amin
+\begin_inset LatexCommand index
+name "amin"
+
+\end_inset
+
+
+\series default
+,
+\series bold
+argmin
+\series default
+
+\begin_inset LatexCommand index
+name "argmin"
+
+\end_inset
+
+,
+\series bold
+ptp
+\series default
+
+\begin_inset LatexCommand index
+name "ptp"
+
+\end_inset
+
+,
+\series bold
+alen
+\series default
+
+\begin_inset LatexCommand index
+name "alen"
+
+\end_inset
+
+,
+\series bold
+searchsorted
+\series default
+
+\begin_inset LatexCommand index
+name "searchsorted"
+
+\end_inset
+
+,
+\series bold
+diagonal
+\series default
+
+\begin_inset LatexCommand index
+name "diagonal"
+
+\end_inset
+
+,
+\series bold
+trace
+\series default
+
+\begin_inset LatexCommand index
+name "trace"
+
+\end_inset
+
+,
+\series bold
+ravel
+\series default
+
+\begin_inset LatexCommand index
+name "ravel"
+
+\end_inset
+
+,
+\series bold
+nonzero
+\series default
+
+\begin_inset LatexCommand index
+name "nonzero"
+
+\end_inset
+
+,
+\series bold
+shape
+\series default
+
+\begin_inset LatexCommand index
+name "shape"
+
+\end_inset
+
+,
+\series bold
+compress
+\series default
+
+\begin_inset LatexCommand index
+name "compress"
+
+\end_inset
+
+,
+\series bold
+clip
+\series default
+
+\begin_inset LatexCommand index
+name "clip"
+
+\end_inset
+
+,
+\series bold
+std
+\series default
+
+\begin_inset LatexCommand index
+name "std"
+
+\end_inset
+
+,
+\series bold
+var
+\series default
+
+\begin_inset LatexCommand index
+name "var"
+
+\end_inset
+
+,
+\series bold
+mean
+\series default
+
+\begin_inset LatexCommand index
+name "mean"
+
+\end_inset
+
+,
+\series bold
+sum
+\series default
+
+\begin_inset LatexCommand index
+name "sum"
+
+\end_inset
+
+,
+\series bold
+cumsum
+\series default
+
+\begin_inset LatexCommand index
+name "cumsum"
+
+\end_inset
+
+,
+\series bold
+product
+\series default
+
+\begin_inset LatexCommand index
+name "product"
+
+\end_inset
+
+,
+\series bold
+cumproduct
+\series default
+
+\begin_inset LatexCommand index
+name "cumproduct"
+
+\end_inset
+
+,
+\series bold
+sometrue
+\begin_inset LatexCommand index
+name "sometrue"
+
+\end_inset
+
+
+\series default
+ (method is .any),
+\series bold
+alltrue
+\begin_inset LatexCommand index
+name "alltrue"
+
+\end_inset
+
+
+\series default
+ (method is .all),
+\series bold
+around
+\begin_inset LatexCommand index
+name "around"
+
+\end_inset
+
+
+\series default
+ (method is .round),
+\series bold
+rank
+\begin_inset LatexCommand index
+name "rank"
+
+\end_inset
+
+
+\series default
+ (attribute is .ndim),
+\series bold
+shape
+\series default
+
+\begin_inset LatexCommand index
+name "shape"
+
+\end_inset
+
+,
+\series bold
+size
+\begin_inset LatexCommand index
+name "size"
+
+\end_inset
+
+
+\series default
+ (.size or .shape[axis]), and
+\series bold
+copy
+\series default
+
+\begin_inset LatexCommand index
+name "copy"
+
+\end_inset
+
+.
+
+\end_layout
+
+\begin_layout Section
+Dealing with data types
+\end_layout
+
+\begin_layout Description
+dtype (obj, align=0)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Return a data-type object from any object.
+ See Chapter
+\begin_inset LatexCommand ref
+reference "cha:Data-descriptor-objects"
+
+\end_inset
+
+ for a more detailed explanation of what can be interpreted as a data-type
+ object and the meaning of the align keyword.
+
+\end_layout
+
+\begin_layout Description
+maximum_sctype (arg)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Returns the array-scalar type of highest precision of the same general
+ kind as arg which can be any recognized form for describing a data-type.
+\end_layout
+
+\begin_layout Description
+issctype (obj)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Returns True if obj is an array data type (or a recognized alias for one)
+\end_layout
+
+\begin_layout Description
+obj2sctype (obj, default=None)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Returns the array type object corresponding to obj which can be an array
+ type already, a python type object, an actual array, or any recognized
+ alias for an array type object.
+ If no suitable data type object can be determined, return default.
+\end_layout
+
+\begin_layout Description
+sctype2char (sctype)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Return the typecode character associated with an array-scalar type dtype.
+ The first argument is first converted to a dtype if it needs to be.
+
+\end_layout
+
+\begin_layout Tip
+the type attribute of data-type objects are actual Python type objects subclasse
+d in a hierarchy of types.
+ This can often be useful to check data types generically.
+ For example, issubclass(dtype.type, integer) can check to see if the data
+ type is one of the 10 different integer types.
+ The issubclass function, however, raises an error if either argument is
+ not an actual type object.
+ NumPy defines _(arg1, arg2) that will return false instead of raise an
+ error.
+ Alternatively, dtype.kind is a character describing the class of the data-type
+ so dtype.kind in 'iu' would also check to see if the data-type is an integer
+ type.
+\end_layout
+
+\begin_layout Description
+can_cast (from=d1, to=d2)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Return Boolean value indicating whether or not data type d1 can be cast
+ to data type d2 safely (without losing precision or information).
+
+\end_layout
+
+\begin_layout Chapter
+Additional Convenience Routines
+\end_layout
+
+\begin_layout Quotation
+A committee is twelve men doing the work of one.
+\end_layout
+
+\begin_layout Right Address
+---
+\emph on
+John F.
+ Kennedy
+\end_layout
+
+\begin_layout Quotation
+Your mind can only hold one thought at a time.
+ Make it a positive and constructive one.
+\end_layout
+
+\begin_layout Right Address
+---
+\emph on
+H.
+ Jackson Brown Jr.
+
+\end_layout
+
+\begin_layout Section
+Shape functions
+\end_layout
+
+\begin_layout Description
+atleast_1d
+\begin_inset LatexCommand index
+name "atleast\\_1d"
+
+\end_inset
+
+ (a1,a2,...,an)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Force a sequence of arrays (including array scalars) to each be at least
+ 1-d.
+
+\end_layout
+
+\begin_layout Description
+atleast_2d
+\begin_inset LatexCommand index
+name "atleast\\_2d"
+
+\end_inset
+
+ (a1,a2,...,an)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Force a sequence of arrays (including array scalars) to each be at least
+ 2-d.
+ Dimensions of length 1 are pre-pended to reach a two-dimensional array.
+\end_layout
+
+\begin_layout Description
+atleast_3d
+\begin_inset LatexCommand index
+name "atleast\\_3d"
+
+\end_inset
+
+ (a1,a2,...,an)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Force a sequence of arrays (including array_scalars) to each be at least
+ 3-d.
+ Dimensions of length 1 are pre-pended to reach a two-dimensional array.
+\end_layout
+
+\begin_layout Description
+roll
+\begin_inset LatexCommand index
+name "roll"
+
+\end_inset
+
+ (arr, shift, axis=None)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Return a new array with the contents of arr shifted (rolled) by the amount
+ given in the integer argument shift along the axis specified.
+ If axis is None, then the shift takes place in the ravelled array (but
+ the returned array has the same shape as arr).
+ Elements that shift outside the array are rolled back into the array from
+ the opposite side.
+
+\end_layout
+
+\begin_layout Description
+rollaxis
+\begin_inset LatexCommand index
+name "rollaxis"
+
+\end_inset
+
+ (arr, axis, start)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Return arr transposed so that the provided axis is inserted into the shape
+ before start with the other dimensions rolled.
+ Thus, if arr.shape is (i,j,k,l) then rollaxis(arr, 2, 0) has shape (k,i,j,l)
+ and rollaxis(arr, 1, 3) has shape (i,k,j,l).
+\end_layout
+
+\begin_layout Description
+vstack
+\begin_inset LatexCommand index
+name "vstack"
+
+\end_inset
+
+ (seq)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Stack a sequence of arrays along the first axis (row wise).
+ Arrays in seq must have the same shape along all dimensions but the first.
+ Rebuilds array divided by vsplit.
+ All 1-d arrays will be stacked row-wise.
+\end_layout
+
+\begin_layout Description
+hstack
+\begin_inset LatexCommand index
+name "hstack"
+
+\end_inset
+
+ (seq)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Stack a sequence of arrays along the second axis (column wise).
+ Arrays in seq must have the same shape along all dimensions but the second.
+ Rebuilds array divided by hsplit.
+ Notice that 1-d arrays will be appended into a new 1-d array.
+ Use column_stack to get a 2-d array from 1-d arrays.
+ If some arrays are already 2-d, then the 1-d arrays need to have a dimension
+ added to the end (
+\emph on
+e.g.
+
+\emph default
+
+\family typewriter
+y[:,newaxis]
+\family default
+) in order to stack correctly.
+
+\end_layout
+
+\begin_layout Description
+column_stack
+\begin_inset LatexCommand index
+name "column\\_stack"
+
+\end_inset
+
+ (seq)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Stack a sequence of arrays as columns into a 2-d array.
+ 1-d arrays are converted to 2-d arrays and transposed.
+ All arrays must have shapes so that the resulting array is well defined.
+ Compare with
+\series bold
+hstack
+\series default
+.
+\end_layout
+
+\begin_layout Description
+row_stack
+\begin_inset LatexCommand index
+name "row\\_stack"
+
+\end_inset
+
+ (seq)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Stack a sequence of 1-d arrays as rows into a 2-d array (alias for
+\series bold
+vstack
+\series default
+).
+
+\end_layout
+
+\begin_layout Description
+dstack
+\begin_inset LatexCommand index
+name "dstack"
+
+\end_inset
+
+ (seq)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Stack a sequence of arrays along the third axis (depth wise).
+ Arrays in seq must have the same shape along all dimensions but the third.
+ Rebuilds array divided by vsplit.
+\end_layout
+
+\begin_layout Description
+array_split
+\begin_inset LatexCommand index
+name "array\\_split"
+
+\end_inset
+
+ (ary, i_or_s, axis=0)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Divide ary into a list of sub-arrays along the specified axis.
+ The i_or_s argument stands for indices_or_sections.
+ If i_or_s is an integer, ary is divided into that many equally-sized arrays.
+ If it is impossible to make an even split, each of the leading arrays in
+ the returned list have one additional member.
+ If i_or_s is a list of sorted integer, its entries define the indexes where
+ ary is split.
+ An empty list for i_or_s results in a single sub-array equal to the original
+ array.
+\end_layout
+
+\begin_layout Description
+split
+\begin_inset LatexCommand index
+name "split"
+
+\end_inset
+
+ (ary, i_or_s, axis=0)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ The same as array_split() except if i_or_s is an integer and it is impossible
+ to make an even split, an error is raised.
+\end_layout
+
+\begin_layout Description
+hsplit
+\begin_inset LatexCommand index
+name "hsplit"
+
+\end_inset
+
+ (ary, i_or_s)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Split a single array into multiple columns of sub-arrays (along the first
+ axis if 1-d or along the second second if >1-d).
+ Only works on arrays of 1 or more dimension.
+
+\end_layout
+
+\begin_layout Description
+vsplit
+\begin_inset LatexCommand index
+name "vsplit"
+
+\end_inset
+
+ ()
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Split a single array into multiple rows of sub-arrays (along the first
+ axis).
+ Only works on arrays of 2 or more dimensions.
+\end_layout
+
+\begin_layout Description
+dsplit
+\begin_inset LatexCommand index
+name "dsplit"
+
+\end_inset
+
+ ()
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Split a single array into multiple sub-arrays along the third axis (depth).
+ Only works on arrays of 3 or more dimensions.
+\end_layout
+
+\begin_layout Description
+apply_along_axis
+\begin_inset LatexCommand index
+name "apply\\_along\\_axis"
+
+\end_inset
+
+ (func1d, axis, arr, *args)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Execute func1d(arr[sel_i], *args) where func1d takes 1-d arrays and arr
+ is an N-d array, where sel_i is a selection object sufficient to select
+ a 1-d sub-array along the given axis.
+ The function is executed for all 1-d arrays along axis in arr.
+
+\end_layout
+
+\begin_layout Description
+apply_over_axes
+\begin_inset LatexCommand index
+name "apply\\_over\\_axes"
+
+\end_inset
+
+ (func, a, axes)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ For each axis in the axes sequence, call func as
+\family typewriter
+res=func(a, axis)
+\family default
+.
+ If res is the same shape as a then set
+\family typewriter
+a=res
+\family default
+ and continue.
+ if
+\family typewriter
+res.ndim = a.ndim -1
+\family default
+, then insert a dimension before axis and continue.
+
+\end_layout
+
+\begin_layout Description
+expand_dims
+\begin_inset LatexCommand index
+name "expand\\_dims"
+
+\end_inset
+
+ (a, axis)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Expand the shape of array a by including newaxis
+\series bold
+before
+\series default
+ the given axis.
+\end_layout
+
+\begin_layout Description
+resize
+\begin_inset LatexCommand index
+name "resize"
+
+\end_inset
+
+ (a, new_shape)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Returns a new array with the specified shape which can be any size.
+ The new array is filled with repeated copies of a.
+ This function is similar in spirit to a.resize(new_shape) except that it
+ fills in the new array with repeated copies and returns a new array.
+
+\end_layout
+
+\begin_layout Description
+kron
+\begin_inset LatexCommand index
+name "kron"
+
+\end_inset
+
+ (a, b)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Return a composite array with blocks from
+\emph on
+b
+\emph default
+ scaled by elements of
+\emph on
+a
+\emph default
+.
+ The number of dimensions of
+\emph on
+a
+\emph default
+ and
+\emph on
+b
+\emph default
+ should be the same.
+ If not, then the input with fewer dimensions is pre-pended with ones (broadcast
+) to the same shape as the input with more dimensions.
+ The return array has this same number of dimensions with shape given by
+ the product of the shape of
+\emph on
+a
+\emph default
+ and the shape of
+\emph on
+b
+\emph default
+.
+ If either a or b is a scalar then this function is equivalent to multiply(a,b).
+
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ For example, if
+\emph on
+a
+\emph default
+ and
+\emph on
+b
+\emph default
+ are is 1-d the result is
+\begin_inset Formula \[
+\left[\begin{array}{cccc}
+a[0]*b & a[1]*b & \cdots & a[-1]*b\end{array}\right]\]
+
+\end_inset
+
+ while if
+\emph on
+a
+\emph default
+ and
+\emph on
+b
+\emph default
+ are 2-d, the result is
+\begin_inset Formula \[
+\left[\begin{array}{cccc}
+a[0,0]*b & a[0,1]*b & \cdots & a[0,-1]*b\\
+a[1,0]*b & a[1,1]*b & \cdots & a[1,-1]*b\\
+\vdots & \vdots & \ddots & \vdots\\
+a[-1,0]*b & a[-1,1]*b & \cdots & a[-1,-1]*b\end{array}\right]\]
+
+\end_inset
+
+
+\end_layout
+
+\begin_deeper
+\begin_layout Description
+Example:
+\end_layout
+
+\end_deeper
+\begin_layout MyCode
+>>> kron([1,10,100],[5,6,7])
+\newline
+array([ 5, 6, 7, 50, 60, 70, 500, 600,
+ 700])
+\newline
+>>> kron([[1,10],[100,1000]],[[2,3],[4,5]])
+\newline
+array([[ 2, 3, 20,
+ 30],
+\newline
+ [ 4, 5, 40, 50],
+\newline
+ [ 200, 300, 2000, 3000],
+\newline
+
+ [ 400, 500, 4000, 5000]])
+\end_layout
+
+\begin_layout Description
+tile
+\begin_inset LatexCommand index
+name "tile"
+
+\end_inset
+
+ (a, reps)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Tile an
+\begin_inset Formula $N$
+\end_inset
+
+-dimensional array using the shape information in reps to create a larger
+
+\begin_inset Formula $N$
+\end_inset
+
+-dimensional array.
+ This is equivalent to kron(ones(reps, a.dtype), a).
+ The number of dimensions of a and the length of shape should be the same
+ or else 1's will be pre-pended to make them the same.
+
+\end_layout
+
+\begin_deeper
+\begin_layout Description
+Example:
+\end_layout
+
+\end_deeper
+\begin_layout MyCode
+>>> tile([5,6,7],(1,2,3))
+\newline
+array([[[5, 6, 7, 5, 6, 7, 5, 6, 7],
+\newline
+ [5,
+ 6, 7, 5, 6, 7, 5, 6, 7]]])
+\end_layout
+
+\begin_layout Section
+Basic functions
+\end_layout
+
+\begin_layout Description
+average
+\begin_inset LatexCommand index
+name "average"
+
+\end_inset
+
+ (a, axis=None, weights=None, returned=0)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Computes the average along the indicated axis.
+ If axis is None, average over the entire array.
+ Inputs can be integer or floating types; result is type float.
+ If weights are given, the result is sum(a*weights)/sum(weights).
+ Therefore, weights must have shape equal to a.shape or be 1-d with length
+ a.shape[axis].
+ Integer weights are converted to float.
+ If returned is True, then return a tuple showing both the result and the
+ sum of the weights (or count of the values).
+ The shape of these two results will be the same.
+
+\end_layout
+
+\begin_layout Description
+cov
+\begin_inset LatexCommand index
+name "cov"
+
+\end_inset
+
+ (x, y=None, rowvar=1, bias=0)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Compute the covariance matrix of data in x.
+ If x is a vector and y is None, then this function is equivalent to asarray(x).v
+ar().
+ Otherwise, x is interpreted as observations of several random variables.
+ If rowvar is True (default), then the variables are in the rows and the
+ observations of the variables are in the columns.
+ Otherwise, the variables are in the columns and the observations are in
+ the rows.
+ If y is given then it is treated as another variable or set of variables
+ to be added to x.
+ By default, a so-called unbiased estimate of the covariance matrix is made.
+ If bias is non-zero, then a biased normalization factor (with better mean-squar
+e error performance) is used instead.
+ If
+\begin_inset Formula $\mathbf{X}$
+\end_inset
+
+ is a random vector, then the covariance matrix is defined as
+\begin_inset Formula \[
+\mathbf{C}=E\left[\left(\mathbf{X}-E\mathbf{X}\right)\left(\mathbf{X}-E\mathbf{X}\right)^{H}\right].\]
+
+\end_inset
+
+ It can be approximated as
+\begin_inset Formula \[
+\mathbf{C}\approx\frac{1}{P}\sum_{i=0}^{N-1}\left(\mathbf{x}_{i}-\bar{\mathbf{x}}\right)\left(\mathbf{x}_{i}-\bar{\mathbf{x}}\right)^{H}\]
+
+\end_inset
+
+ where
+\begin_inset Formula $\mathbf{x}_{i}$
+\end_inset
+
+ is an observation of
+\begin_inset Formula $\mathbf{X}$
+\end_inset
+
+ (as a column-vector),
+\begin_inset Formula $N$
+\end_inset
+
+ is the number of observations made and
+\begin_inset Formula $P=N-1$
+\end_inset
+
+ for an unbiased estimate or
+\begin_inset Formula $P=N$
+\end_inset
+
+ for a biased (but lower mean-squared error) estimate.
+
+\end_layout
+
+\begin_layout Description
+corrcoef
+\begin_inset LatexCommand index
+name "corrcoef"
+
+\end_inset
+
+ (x, y=None, rowvar=1, bias=0)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Estimate the correlation coefficient of x.
+ By default, each row of x contains a random variable with observations
+ of the random variable in the columns of x.
+ (If rowvar is False, the each column is a random variable with observations
+ in the rows).
+ The y argument can be used to append additional variables to x.
+ The
+\begin_inset Formula $i^{\textrm{th}}$
+\end_inset
+
+ row and
+\begin_inset Formula $j^{\textrm{th}}$
+\end_inset
+
+ column of the correlation coefficient matrix is defined as
+\begin_inset Formula \[
+\rho_{ij}=\frac{C_{ij}}{\sqrt{C_{ii}C_{jj}}}\]
+
+\end_inset
+
+ where
+\begin_inset Formula $\mathbf{C}$
+\end_inset
+
+ is the covariance matrix.
+ The rowvar and bias arguments are passed on to the cov function to estimate
+
+\begin_inset Formula $\mathbf{C}.$
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+msort
+\begin_inset LatexCommand index
+name "msort"
+
+\end_inset
+
+ (a)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Return a new array, sorted along the first axis.
+ Equivalent to b=a.copy(); b.sort(0)
+\end_layout
+
+\begin_layout Description
+median
+\begin_inset LatexCommand index
+name "median"
+
+\end_inset
+
+ (m)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Returns the median of m along its first dimension.
+\end_layout
+
+\begin_layout Description
+bincount
+\begin_inset LatexCommand index
+name "bincount"
+
+\end_inset
+
+ (list=, weights=None)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ The list argument is a 1-d integer array.
+ Let
+\begin_inset Formula $r$
+\end_inset
+
+ be the returned 1-d array whose length is (list.max()+1).
+ If weights is None, then
+\begin_inset Formula $r[i]$
+\end_inset
+
+ is the number of occurrences of
+\begin_inset Formula $i$
+\end_inset
+
+ in list.
+ If weight is present, then the
+\begin_inset Formula $i^{\textrm{th}}$
+\end_inset
+
+ element is
+\begin_inset Formula \[
+r[i]=\sum_{j:\textrm{list}\left[j\right]=i}\textrm{weights}[j].\]
+
+\end_inset
+
+ Notice that if weights is None, it is equivalent to a weights array of
+ all 1.
+ The length of weights must be the same as the length of list.
+
+\end_layout
+
+\begin_layout Description
+digitize
+\begin_inset LatexCommand index
+name "digitize"
+
+\end_inset
+
+ (x=,bins=)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Return an array of integers the same length as x with values
+\begin_inset Formula $i$
+\end_inset
+
+ such that
+\begin_inset Formula $\textrm{bins}\left[i-1\right]\leq x<\textrm{bins}\left[i\right]$
+\end_inset
+
+ if bins is monotonically increasing, or
+\begin_inset Formula $\textrm{bins}[i]\leq x<\textrm{bins}[i-1]$
+\end_inset
+
+ if bins is monotonically decreasing.
+ When
+\begin_inset Formula $x$
+\end_inset
+
+ is beyond the bounds of bins, return either
+\begin_inset Formula $i=0$
+\end_inset
+
+ or
+\begin_inset Formula $i=$
+\end_inset
+
+len(bins) as appropriate.
+\end_layout
+
+\begin_layout Description
+histogram
+\begin_inset LatexCommand index
+name "histogram"
+
+\end_inset
+
+ (x=, bins=None, range=None, normed=0)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Construct a histogram for the data in x (treated as one-dimensional array
+ of type float).
+ If bins is not a sequence, then bins should be the number of bins which
+ will be constructed ranging from range[0] to range[1] or x.min() to x.max()
+ if range is None.
+ If normed is True, then the histogram will be normalized and comparable
+ with a probability density function, otherwise it will be a count of the
+ number of items in each bin.
+ The return value is the tuple (n, bins) where n is the histogram.
+\end_layout
+
+\begin_layout Description
+histogram2d
+\begin_inset LatexCommand index
+name "histogram2d"
+
+\end_inset
+
+ (x, y, bins=10, range=None, normed=False)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Compute the two-dimensional histogram for a dataset (x,y) given the bins.
+ Returns (histogram, xedges, yedges).
+ The bins argument can be either the number of bins or a sequence of the
+ bin edges if the x and y directions should have the same bins.
+ If the bins argument is a sequence of length 2, then separate bin edges
+ will be computed.
+ The first element can be either the number of bins or the bin edges for
+ the x-direction.
+ The second element is interpreted as the number of bins or the bin edges
+ for the y-direction.
+ The returned histogram array, H, is a count of the number of samples in
+ each bin.
+ The array is oriented such that H[i,j] is the number of samples falling
+ into binx[j] and biny[i] (notice the association x<->j and y<->i).
+ Setting normed to True returns a density rather than a bin-count.
+ The range argument allows specifying lower and upper bin edges (in a sequence
+ of length 2 with 2-length sequences in each entry).
+ The default is [[x.min(), x.max()],[y.min(), y.max()]].
+
+\end_layout
+
+\begin_layout Description
+histogramdd
+\begin_inset LatexCommand index
+name "histogramdd"
+
+\end_inset
+
+ (sample, bins=10, range=None, normed=False)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Compute the
+\begin_inset Formula $D$
+\end_inset
+
+-dimensional histogram for a (vector) dataset contained in sample give the
+ bins.
+ The dataset is a sequence of
+\begin_inset Formula $D$
+\end_inset
+
+ arrays or an
+\begin_inset Formula $N\times D$
+\end_inset
+
+ array where
+\begin_inset Formula $N$
+\end_inset
+
+ is the number of samples and
+\begin_inset Formula $D$
+\end_inset
+
+ is the number of dimensions.
+ Returns (histogram, edges) where histogram is a
+\begin_inset Formula $D$
+\end_inset
+
+-dimensional array of shape given by the number of bins selected in each
+ axis containing the number of counts that a point in the sample data fell
+ into the volume bin specified.
+ The edges sequence has
+\begin_inset Formula $D$
+\end_inset
+
+-entries to specify the edge boundaries for each dimension.
+ The bins argument is a sequence of edge arrays or a sequence of the number
+ of bins.
+ If a scalar is given, it is assumed to be the number of bins for all dimensions.
+ The range is a length-
+\begin_inset Formula $D$
+\end_inset
+
+ sequence containing lower and upper bin edges which default to the min
+ and maximum of the respective datasets.
+ If normed is True, then a density rather than a bin-count is returned.
+
+\end_layout
+
+\begin_layout Description
+logspace
+\begin_inset LatexCommand index
+name "logspace"
+
+\end_inset
+
+ (start, stop, num=50, endpoint=True,base=10.0)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Evenly spaced samples on a logarithmic scale.
+ Returns num evenly spaced (in logspace) samples from base**start to base**stop.
+ If endpoint is True, then the last sample is base**stop.
+\end_layout
+
+\begin_layout Description
+linspace
+\begin_inset LatexCommand index
+name "linspace"
+
+\end_inset
+
+ (start, stop, num=50, endpoint=True, retstep=False):
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Evenly spaced samples.
+ Returns num evenly spaced samples from start to stop.
+ If endpoint is True, then the last sample is stop.
+ If retstep is True, then return the computed step size.
+\end_layout
+
+\begin_layout Description
+meshgrid
+\begin_inset LatexCommand index
+name "meshgrid"
+
+\end_inset
+
+ (x, y)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ For 1-d arrays x, y with lengths Nx=len(x) and Ny = len(y), return X, Y
+ where X and Y are (Ny, Nx) shaped arrays with the elements of x and y repeated
+ to fill the array.
+
+\end_layout
+
+\begin_layout MyCode
+>>> X,Y = meshgrid([1,2,3], [4,5,6,7]); print X; print Y
+\newline
+[[1 2 3]
+\newline
+ [1 2 3]
+\newline
+
+ [1 2 3]
+\newline
+ [1 2 3]]
+\newline
+[[4 4 4]
+\newline
+ [5 5 5]
+\newline
+ [6 6 6]
+\newline
+ [7 7 7]]
+\end_layout
+
+\begin_layout Description
+select
+\begin_inset LatexCommand index
+name "select"
+
+\end_inset
+
+ (condlist, choicelist, default=0)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Returns an array comprised from different elements of choicelist depending
+ on the list of conditions.
+ The condlist argument is a list of Boolean condition arrays.
+ The choicelist argument is a list of choice arrays (of the same size as
+ the arrays in condlist).
+ The result has the same size as the arrays in choicelist.
+ If condlist is [
+\begin_inset Formula $c_{0},\ldots,c_{N-1}$
+\end_inset
+
+], then choicelist must be of length
+\begin_inset Formula $N$
+\end_inset
+
+.
+ The elements of choicelist can then be represented as [
+\begin_inset Formula $v_{0},\ldots,v_{N-1}$
+\end_inset
+
+].
+ The default choice if none of the conditions are met is given as the default
+ argument.
+ The conditions are tested in order and the first one satisfied is used
+ to select the choice.
+ In other words, the elements of the output array are found from the following
+ tree (evaluated on an element-by-element basis)
+\end_layout
+
+\begin_layout LyX-Code
+
+\series bold
+if
+\series default
+
+\begin_inset Formula $c_{0}$
+\end_inset
+
+:
+\begin_inset Formula $v_{0}$
+\end_inset
+
+
+\newline
+
+\series bold
+elif
+\series default
+
+\begin_inset Formula $c_{1}$
+\end_inset
+
+:
+\begin_inset Formula $v_{1}$
+\end_inset
+
+
+\newline
+...
+\newline
+
+\series bold
+elif
+\series default
+
+\begin_inset Formula $c_{N-1}$
+\end_inset
+
+:
+\begin_inset Formula $v_{N-1}$
+\end_inset
+
+
+\newline
+
+\series bold
+else
+\series default
+: default
+\end_layout
+
+\begin_layout Description
+piecewise
+\begin_inset LatexCommand index
+name "piecewise"
+
+\end_inset
+
+ (x, condlist, funclist, *args, **kw)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Compute a piecewise-defined function.
+ A piecewise defined function is
+\begin_inset Formula \[
+f\left(x\right)=\left\{ \begin{array}{cc}
+f_{1}\left(x\right) & x\in S_{1},\\
+f_{2}\left(x\right) & x\in S_{2},\\
+\vdots & \vdots\\
+f_{n}\left(x\right) & x\in S_{n}.\end{array}\right.\]
+
+\end_inset
+
+where
+\begin_inset Formula $S_{1}$
+\end_inset
+
+ are sets.
+ Thus, the function is defined differently over different sub-domains of
+ the input.
+ Such a function can be computed using
+\family typewriter
+select
+\family default
+ but such an implementation means calling each
+\begin_inset Formula $f_{i}$
+\end_inset
+
+ over the entire region of
+\begin_inset Formula $x.$
+\end_inset
+
+ The piecewise call guarantees that each function
+\begin_inset Formula $f_{i}$
+\end_inset
+
+ will only be called over those values of
+\begin_inset Formula $x$
+\end_inset
+
+ in
+\begin_inset Formula $S_{i}.$
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Arguments: x is the array of values over which to call the function; condlist
+ is a sequence of Boolean (indicator) arrays (or a single Boolean array)
+ of the same shape as
+\begin_inset Formula $x$
+\end_inset
+
+ that defines the sets (True indicates that element of
+\begin_inset Formula $x$
+\end_inset
+
+ is in the set).
+ If needed, to match the length of funclist, an
+\begin_inset Quotes eld
+\end_inset
+
+otherwise
+\begin_inset Quotes erd
+\end_inset
+
+ set will be added to condlist.
+ This otherwise set is defined as
+\begin_inset Formula $S_{n}=\overline{\bigcup S_{i}}.$
+\end_inset
+
+ The argument funclist is a list of functions to be called (or items to
+ be inserted) corresponding to the conditions.
+ Each of these functions can take extra arguments and key-word arguments
+ which are passed in as *args, and **kw using standard Python syntax.
+ Each of these functions should return vector output for vector input.
+ If the function is a scalar, then it will simply be inserted where appropriate
+ into the output.
+ It is the equivalent of a constant function.
+
+\end_layout
+
+\begin_deeper
+\begin_layout Description
+Example: Suppose we want to compute
+\begin_inset Formula $f\left(x\right)=x^{2}\Pi\left(\frac{x}{3}\right)+u\left(x-5\right)$
+\end_inset
+
+ where
+\begin_inset Formula $\Pi\left(x\right)=1$
+\end_inset
+
+ only when
+\begin_inset Formula $\left|x\right|\leq1$
+\end_inset
+
+ and
+\begin_inset Formula $u\left(x\right)=1$
+\end_inset
+
+ only when
+\begin_inset Formula $x\geq0.$
+\end_inset
+
+ This could be done using the code:
+\end_layout
+
+\end_deeper
+\begin_layout MyCode
+>>> f1 = lambda x: x*x
+\newline
+>>> x = r_[-4:6:20j]
+\newline
+>>> y = piecewise(x,abs(x)<=3,[f1,0])+
+piecewise(x,x>=0,[1,0])
+\newline
+>>> set_printoptions(precision=4); print y
+\newline
+[ 0.
+ 0.
+ 8.687 5.8615 3.59 1.8726 0.7091 0.0997
+\newline
+ 1.0443 1.5429 2.5956 4.2022
+ 6.3629 9.0776 1.
+ 1.
+ 1.
+\newline
+ 1.
+ 1.
+ 1.
+ ]
+\end_layout
+
+\begin_layout Description
+trim_zeros
+\begin_inset LatexCommand index
+name "trim\\_zeros"
+
+\end_inset
+
+ (filt, trim='fb'):
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Trim the leading ('f' in trim) and trailing ('b' in trim) zeros from a
+ sequence according to the trim keyword.
+
+\end_layout
+
+\begin_layout Description
+trapz
+\begin_inset LatexCommand index
+name "trapz"
+
+\end_inset
+
+ (y, x=None, dx=1.0, axis=-1)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ If
+\begin_inset Formula $\mathbf{y}$
+\end_inset
+
+ contains samples of a function:
+\begin_inset Formula $y_{i}=f\left(x_{i}\right)$
+\end_inset
+
+ then trapz can be used to approximate the integral of the function using
+ the trapezoidal rule.
+ If the sampling is not evenly spaced use
+\begin_inset Formula $\mathbf{x}$
+\end_inset
+
+ to pass in the sample positions.
+ Otherwise, only the sample-spacing is needed in dx.
+ The trapz function can work with many functions at a time stored in an
+
+\begin_inset Formula $N$
+\end_inset
+
+-dimensional array.
+ The axis argument controls which axis defines the sampling axis (the other
+ dimensions are different functions).
+ The number of dimensions of the returned result is
+\begin_inset Formula $y$
+\end_inset
+
+.ndim - 1.
+\end_layout
+
+\begin_layout Description
+diff
+\begin_inset LatexCommand index
+name "diff"
+
+\end_inset
+
+ (x, n=1, axis=-1)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Calculates the
+\begin_inset Formula $n^{\textrm{th}}$
+\end_inset
+
+ order, discrete difference along the given axis.
+\end_layout
+
+\begin_layout Description
+gradient
+\begin_inset LatexCommand index
+name "gradient"
+
+\end_inset
+
+ (f, *varargs)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Calculate the gradient of an N-d scalar function, f.
+ Uses central differences on the interior and first differences on boundaries
+ to give the same shape for each component of the gradient.
+ The varargs variable can contain 0, 1, or N scalars corresponding to the
+ sample distances in each direction (default 1.0).
+ If f is N-d, then N arrays are returned each of the same shape as f, giving
+ the derivative of f with respect to each dimension.
+
+\end_layout
+
+\begin_layout Description
+angle
+\begin_inset LatexCommand index
+name "angle"
+
+\end_inset
+
+ (z, deg=0)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Return the angle of a complex number z (in degrees if deg is True).
+\end_layout
+
+\begin_layout Description
+unwrap
+\begin_inset LatexCommand index
+name "unwrap"
+
+\end_inset
+
+ (p, discont=pi, axis=-1)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Unwraps radian phase p by changing absolute jumps greater than discont
+ to their
+\begin_inset Formula $2\pi$
+\end_inset
+
+ complement along the given axis.
+
+\end_layout
+
+\begin_layout Description
+sort_complex
+\begin_inset LatexCommand index
+name "sort\\_complex"
+
+\end_inset
+
+ (x)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ This is syntactic sugar for asarray(x).sort().astype(<cmplx_type>) where
+ cmplx_type is csingle if x.dtype is integral with fewer bits than intp,
+ clongfloat if x.dtype.type is longfloat, and cdouble for all other types.
+ The sorting is done by comparing the real part of the array, and then the
+ imaginary part if the real parts are the same.
+
+\end_layout
+
+\begin_layout Description
+disp
+\begin_inset LatexCommand index
+name "disp"
+
+\end_inset
+
+ (mesg, device=None, linefeed=1)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Display a message to device (defaults to sys.stdout) with or without a closing
+ linefeed.
+\end_layout
+
+\begin_layout Description
+unique
+\begin_inset LatexCommand index
+name "unique"
+
+\end_inset
+
+ (seq)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Returns unique items in the 1-dimensional seq.
+\end_layout
+
+\begin_layout Description
+extract
+\begin_inset LatexCommand index
+name "extract"
+
+\end_inset
+
+ (condition, arr)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Equivalent to arr.compress(condition.flat) and arr.flat[bool_(condition.flat)]
+ which extracts the elements of (flattened) arr according to the elements
+ of (flattened) condition that are True.
+
+\end_layout
+
+\begin_layout Description
+place
+\begin_inset LatexCommand index
+name "place"
+
+\end_inset
+
+ (arr, mask, vals)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Inverse of extract.
+ Equivalent to arr[abool(mask)] = vals but it uses a different algorithm.
+
+\end_layout
+
+\begin_layout Description
+delete
+\begin_inset LatexCommand index
+name "delete"
+
+\end_inset
+
+ (arr, indices, axis=None)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Return a new array with the sub-arrays indicated by indices along axis
+ removed.
+ If axis is None, then first ravel the array and set axis to -1.
+ The indices argument describes which sub-arrays along the given axis should
+ be removed.
+ It can be an integer, a slice object, or a sequence of integers.
+ A new array is created with the corresponding sub-arrays are removed.
+
+\end_layout
+
+\begin_layout Description
+insert
+\begin_inset LatexCommand index
+name "insert"
+
+\end_inset
+
+ (arr, indices, values, axis=None)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Create a new array with values inserted into arr before indices.
+ If axis is None, then first ravel the array and set axis to -1.
+ The indices argument describes which indices along the provided axis the
+ values should be inserted before.
+ It can be an integer, a slice object, or a sequence of integers.
+ The values argument must be broadcastable to the shape implied by where
+ they will be inserted.
+
+\end_layout
+
+\begin_layout Description
+append
+\begin_inset LatexCommand index
+name "append"
+
+\end_inset
+
+ (arr, values, axis=None)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Return a new array with values appended to the end of the array along axis.
+
+\end_layout
+
+\begin_layout Description
+nansum
+\begin_inset LatexCommand index
+name "nansum"
+
+\end_inset
+
+ (x, axis=None)
+\end_layout
+
+\begin_layout Description
+nanmax
+\begin_inset LatexCommand index
+name "nanmax"
+
+\end_inset
+
+ (x, axis=None)
+\end_layout
+
+\begin_layout Description
+nanargmax
+\begin_inset LatexCommand index
+name "nanargmax"
+
+\end_inset
+
+ (x, axis=None)
+\end_layout
+
+\begin_layout Description
+nanargmin
+\begin_inset LatexCommand index
+name "nanargmin"
+
+\end_inset
+
+ (x, axis=None)
+\end_layout
+
+\begin_layout Description
+nanmin
+\begin_inset LatexCommand index
+name "nanmin"
+
+\end_inset
+
+ (x, axis=None)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ These functions perform their respective operations over the given axis
+ (or the entire array if axis is None), after replacing any nans with appropriat
+e values so as not to affect the calculation.
+
+\end_layout
+
+\begin_layout Description
+vectorize
+\begin_inset LatexCommand index
+name "vectorize"
+
+\end_inset
+
+ (pyfunc, otypes=None, doc=None)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ This creates a class whose instances have a call method that invokes a
+ ufunc that has been dynamically built to call the python function pyfunc
+ internally.
+ The output types can be controlled by the otypes argument.
+ If it is None, then the output types will be determined upon first call
+ to the function using the provided inputs.
+ This can be reset, by re-setting the otypes attribute to
+\begin_inset Quotes eld
+\end_inset
+
+
+\begin_inset Quotes erd
+\end_inset
+
+.
+ The normal rules of array broadcasting are followed by the returned object.
+\end_layout
+
+\begin_layout MyCode
+>>> def myfunc(a,b):
+\newline
+...
+ if (a>b): return a
+\newline
+...
+ else: return b-1
+\newline
+>>> vecfunc = vectorize(myfunc)
+\newline
+>>> vecfunc([[1,2,3],[5,6,9]
+],[7,4,5])
+\newline
+array([[6, 3, 4],
+\newline
+ [6, 6, 9]])
+\end_layout
+
+\begin_layout Description
+asarray_chkfinite
+\begin_inset LatexCommand index
+name "asarray\\_chkfinite"
+
+\end_inset
+
+ (x)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Like asarray(x) except an error is raised if any of the values in x are
+ not finite.
+
+\end_layout
+
+\begin_layout Description
+round_
+\begin_inset LatexCommand index
+name "round\\_"
+
+\end_inset
+
+ (x, decimals=0)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Return an array with all the elements of x rounded to decimals places.
+ Returns x if array is not floating point and rounds both the real and imaginary
+ parts separately if array is complex.
+ Rounds in the same way as standard python except for half-way values are
+ rounded to the nearest
+\emph on
+even
+\emph default
+ number.
+\end_layout
+
+\begin_layout Description
+packbits (array, axis=None)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Pack an integer array of logical data (zero/non-zero) into bits of a uint8
+ data-type along the dimension given by axis.
+ This dimension is shrunk by a factor of 8 (rounded up).
+ Each element in the input is converted to a bit in the output which is
+ set to 1 or 0 depending on whether the input is non-zero or not.
+ Thus, every 8-element chunk of the input is converted to a single byte
+ in the output.
+ If axis is None, then the bit-packing is done on the entire array as if
+ it were raveled.
+\end_layout
+
+\begin_layout Description
+unpackbits (array, axis=None)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Unpack bits of an array of uint8 data-type into a single uint8 byte for
+ each bit along the dimension given by axis.
+ This dimension is thus expanded 8-fold, but otherwise the output has the
+ same shape as the input.
+ If axis is None, then the input is treated as a 1-d array and expanded
+ 8-fold so that each bit of the input is given an output byte.
+
+\end_layout
+
+\begin_layout Description
+add_docstring
+\begin_inset LatexCommand index
+name "add\\_docstring"
+
+\end_inset
+
+ (obj, doc)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Adds a docstring to a built-in object, obj, that does not have a docstring
+ defined already.
+ The obj can be a built-in function-or-method, a typeobject, a method descriptor
+, a getset descriptor, or a member descriptor.
+ This is useful for improving the documentation of objects defined in C-compiled
+ code without re-compiling.
+ If the object already has a docstring, a RuntimeError is raised.
+ If the object is not a supported type the code can add a docstring to,
+ a TypeError is raised.
+
+\end_layout
+
+\begin_layout Description
+add_newdoc
+\begin_inset LatexCommand index
+name "add\\_newdoc"
+
+\end_inset
+
+ (place, obj, doc)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Adds a docstring to the
+\emph on
+obj
+\emph default
+ imported from
+\emph on
+place
+\emph default
+ using exec 'from %s import %s' % (place, obj).
+ Thus, both place and obj should be strings.
+ If doc is a string, then a single docstring is added to obj from place.
+ If doc is a 2-tuple, then obj must be an object with attributes that need
+ to be commented.
+ The first element of the doc tuple is the attribute to be commented on
+ and the second element is the actual docstring.
+ If doc is a list, then it must be composed of elements that are 2-tuples
+ indicating that obj has several attributes that need to be documented.
+
+\end_layout
+
+\begin_layout Section
+Polynomial functions
+\end_layout
+
+\begin_layout Standard
+There are two interfaces for dealing with polynomials
+\begin_inset LatexCommand index
+name "polynomials"
+
+\end_inset
+
+: a class-based interface, and a collection of functions to deal with a
+ polynomials represented as a simple list of coefficients.
+ This latter representation results from the is a one-to-one correspondence
+ between a length-
+\begin_inset Formula $\left(n+1\right)$
+\end_inset
+
+ sequence of coefficients
+\begin_inset Formula $a_{n}\equiv a[n]$
+\end_inset
+
+ and an
+\begin_inset Formula $n^{\textrm{th}}$
+\end_inset
+
+ order polynomial:
+\begin_inset Formula \[
+p\left(x\right)=a_{0}x^{n}+a_{1}x^{n-1}+\cdots+a_{n-1}x+a_{n}.\]
+
+\end_inset
+
+ Most of the functions below operate on and return a simple sequence of
+ coefficients representing a polynomial.
+ There is, however, a simple polynomial class that provides some utility
+ for doing simple algebra on polynomials.
+
+\end_layout
+
+\begin_layout Description
+poly1d
+\begin_inset LatexCommand index
+name "poly1d"
+
+\end_inset
+
+ (c_or_r, r=0)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ This construction returns an instance of a simple polynomial class.
+ It can take either a list of coefficients on polynomial powers, or a sequence
+ of roots (if r=1).
+ The returned polynomial can be added, subtracted, multiplied, divided,
+ and taken to integer powers, resulting in new polynomials.
+
+\end_layout
+
+\begin_deeper
+\begin_layout Description
+.r roots of the polynomial
+\end_layout
+
+\begin_layout Description
+.o order of the polynomial
+\end_layout
+
+\begin_layout Description
+.c polynomial coefficients as an array (also
+\series bold
+__array__()
+\series default
+ )
+\end_layout
+
+\begin_layout Description
+__call__(x) evaluate the polynomial at x (can be an array)
+\end_layout
+
+\begin_layout Description
+__getitem__(x) p[k] returns the coefficient on the kth power of x (backwards
+ from indexing the coefficient array)
+\end_layout
+
+\end_deeper
+\begin_layout MyCode
+>>> p=poly1d([2,5,7])
+\newline
+>>> print p
+\newline
+2
+\newline
+2 x + 5 x + 7
+\newline
+>>> print p*[1,3,1]
+\newline
+4
+ 3 2
+\newline
+2 x + 11 x + 24 x + 26 x + 7
+\newline
+>>> print p([0.5,0.6,3])
+\newline
+[ 10.
+ 10.72 40.
+ ]
+\newline
+>>> print p.r
+\newline
+[-1.25+1.3919j -1.25-1.3919j]
+\end_layout
+
+\begin_layout Description
+poly
+\begin_inset LatexCommand index
+name "poly"
+
+\end_inset
+
+ (roots_or_matrix)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Return a sequence of coefficients representing a polynomial given the sequence
+ of roots as an argument.
+ Alternatively, if the argument is a 2-d array, then return the characteristic
+ polynomial of the matrix.
+
+\end_layout
+
+\begin_layout Description
+roots
+\begin_inset LatexCommand index
+name "roots"
+
+\end_inset
+
+ (poly)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Return the roots of the polynomial represented by coefficients in poly
+\end_layout
+
+\begin_layout Description
+polyint
+\begin_inset LatexCommand index
+name "polyint"
+
+\end_inset
+
+ (poly, m=1, k=None)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Return an exact
+\begin_inset Formula $m^{\textrm{th}}$
+\end_inset
+
+-order integral of the polynomial represented in poly.
+ If k is None, then use 0 for the integrating constants.
+ Otherwise, use the scalars in the sequence k as integrating constants.
+ Also available as .integ (m=1,k=0) method of poly1d objects.
+\end_layout
+
+\begin_deeper
+\begin_layout Description
+Example:
+\begin_inset Formula \begin{eqnarray*}
+p\left(x\right) & = & x^{2}+3x+4\\
+\int\int p\left(x\right) & = & \frac{1}{12}x^{4}+\frac{1}{2}x^{3}+2x^{2}+k_{0}x+k_{1}\end{eqnarray*}
+
+\end_inset
+
+
+\end_layout
+
+\end_deeper
+\begin_layout MyCode
+>>> print polyint([1,3,4],m=2,k=[5,3])
+\newline
+[ 0.0833 0.5 2.
+ 5.
+ 3.
+ ]
+\end_layout
+
+\begin_layout Description
+polyder
+\begin_inset LatexCommand index
+name "polyder"
+
+\end_inset
+
+ (poly, m)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Return an exact
+\begin_inset Formula $m^{\textrm{th}}$
+\end_inset
+
+-order derivative of the polynomial represented in poly.
+ Also available as .deriv(m=1) method of poly1d objects.
+\end_layout
+
+\begin_deeper
+\begin_layout Description
+Example:
+\begin_inset Formula \begin{eqnarray*}
+p\left(x\right) & = & x^{3}+2x^{2}+4x+3\\
+\frac{dp}{dx}\left(x\right) & = & 3x^{2}+4x+4\end{eqnarray*}
+
+\end_inset
+
+
+\end_layout
+
+\end_deeper
+\begin_layout MyCode
+>>> polyder([1,2,4,3])
+\newline
+array([3, 4, 4])
+\end_layout
+
+\begin_layout Description
+polyadd
+\begin_inset LatexCommand index
+name "polyadd"
+
+\end_inset
+
+ (p1, p2)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Add the two polynomials represented by coefficients:
+\begin_inset Formula $p_{1}\left(x\right)+p_{2}\left(x\right)$
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+polysub
+\begin_inset LatexCommand index
+name "polysub"
+
+\end_inset
+
+ (p1, p2)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Return coefficients for the polynomial found by subtracting the two polynomials
+ represented by
+\begin_inset Formula $p_{1}$
+\end_inset
+
+ and
+\begin_inset Formula $p_{2}$
+\end_inset
+
+:
+\begin_inset Formula $p_{1}\left(x\right)-p_{2}\left(x\right)$
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+polymul
+\begin_inset LatexCommand index
+name "polymul"
+
+\end_inset
+
+ (p1, p2)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Return the coefficients for
+\begin_inset Formula $p_{1}\left(x\right)p_{2}\left(x\right)$
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+polydiv
+\begin_inset LatexCommand index
+name "polydiv"
+
+\end_inset
+
+ (p1, p2)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Return the quotient,
+\begin_inset Formula $q\left(x\right)$
+\end_inset
+
+, and remainder,
+\begin_inset Formula $r\left(x\right)$
+\end_inset
+
+, so that
+\begin_inset Formula $p_{1}\left(x\right)=q\left(x\right)p_{2}\left(x\right)+r\left(x\right),$
+\end_inset
+
+ with the order of
+\begin_inset Formula $r\left(x\right)$
+\end_inset
+
+ less than the order of
+\begin_inset Formula $p_{2}\left(x\right).$
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+polyval
+\begin_inset LatexCommand index
+name "polyval"
+
+\end_inset
+
+ (p, y)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Evaluate the polynomial
+\begin_inset Formula $p$
+\end_inset
+
+ at
+\begin_inset Formula $y$
+\end_inset
+
+.
+ The argument,
+\begin_inset Formula $y$
+\end_inset
+
+, can be a number or an array or a polynomial object.
+ If x is a polynomial object, then polyval performs polynomial composition:
+
+\begin_inset Formula $p\left(y\left(x\right)\right),$
+\end_inset
+
+ otherwise polyval computes the value of the polynomial at each
+\begin_inset Formula $y$
+\end_inset
+
+.
+ Uses Horner's rule for evaluation, but this can still lead to numerical
+ instabilities for wildly fluctuating coefficients.
+\end_layout
+
+\begin_layout Description
+polyfit
+\begin_inset LatexCommand index
+name "polyfit"
+
+\end_inset
+
+ (x,y,N)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Compute a best-fit polynomial in
+\begin_inset Formula $x$
+\end_inset
+
+ of order
+\begin_inset Formula $N$
+\end_inset
+
+, to the data,
+\begin_inset Formula $y$
+\end_inset
+
+, in the sense of minimizing averaged-squared error between the measurement
+ and the model.
+ Useful for quick line-fitting
+\begin_inset LatexCommand index
+name "fitting"
+
+\end_inset
+
+.
+
+\end_layout
+
+\begin_layout Section
+Set Operations
+\end_layout
+
+\begin_layout Standard
+The set operations
+\begin_inset LatexCommand index
+name "set operations|("
+
+\end_inset
+
+ were kindly contributed by Robert Cimrman.
+ These set operations are based on sorting functions and all expect 1-d
+ sequences with unique elements with the exception of unique1d and intersect1d_n
+u which will flatten N-d nested-sequences to 1-d arrays and can handle non-uniqu
+e elements.
+
+\end_layout
+
+\begin_layout Description
+unique1d
+\begin_inset LatexCommand index
+name "unique1d"
+
+\end_inset
+
+ (arr, retindx=False)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Return the unique elements of arr as a 1-d array.
+ If retindx is True, then also return the indices, ind, such that arr.flat[ind]
+ is the set of unique values.
+\end_layout
+
+\begin_layout Description
+intersect1d
+\begin_inset LatexCommand index
+name "intersect1d"
+
+\end_inset
+
+ (a1, a2)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Return the (sorted) intersection of a1 and a2 which is an array containing
+ the elements of a1 that are also in a2.
+
+\end_layout
+
+\begin_layout Description
+intersect1d_nu
+\begin_inset LatexCommand index
+name "intersect1d\\_nu"
+
+\end_inset
+
+ (a1, a2)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Return the (sorted) intersection of a1 and a2 but allow a1 and a2 to be
+ N-d arrays with non-unique elements.
+ Equivalent to intersect1d(unique1d(a1), unique1d(a2)).
+
+\end_layout
+
+\begin_layout Description
+union1d
+\begin_inset LatexCommand index
+name "union1d"
+
+\end_inset
+
+ (a1, a2)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Return the (sorted) union of a1 and a2 which is an array containing elements
+ that are in either a1 or a2.
+
+\end_layout
+
+\begin_layout Description
+setdiff1d
+\begin_inset LatexCommand index
+name "setdiff1d"
+
+\end_inset
+
+ (a1, a2)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Return the set-difference of a1 and a2 which is an array containing the
+ elements of a1 that are
+\series bold
+not
+\series default
+ in a2.
+\end_layout
+
+\begin_layout Description
+setxor1d
+\begin_inset LatexCommand index
+name "setxor1d"
+
+\end_inset
+
+ (a1, a2)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Return the (sorted) set containing the exclusive-or of the arrays a1 and
+ a2.
+ The exclusive-or contains elements that are in a1 or in a2 as long as the
+ element is not in both a1 and a2.
+
+\end_layout
+
+\begin_layout Description
+setmember1d
+\begin_inset LatexCommand index
+name "setmember1d"
+
+\end_inset
+
+ (tocheck, set)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Return a Boolean 1-d array of the length of tocheck which is True whenever
+ that element is contained in set and false when it is not.
+ Equivalent
+\begin_inset LatexCommand index
+name "set operations|)"
+
+\end_inset
+
+ to array([x in set for x in tocheck]).
+\end_layout
+
+\begin_layout Section
+Array construction using index tricks
+\end_layout
+
+\begin_layout Standard
+The functions and classes in this category make it simpler to construct
+ arrays.
+
+\end_layout
+
+\begin_layout Description
+ix_
+\begin_inset LatexCommand index
+name "ix\\_"
+
+\end_inset
+
+ (*args)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ This indexing cross function is useful for forming indexing arrays necessary
+ to select out the cross-product of
+\begin_inset Formula $N$
+\end_inset
+
+ 1-dimensional arrays.
+ Note that the default indexing does not do a cross-product (which might
+ be unexpected for someone coming from other programming environments).
+ The default indexing is more general purpose.
+ Using the ix_ constructor can produce the indexing arrays necessary to
+ select a cross-product.
+\end_layout
+
+\begin_layout Description
+mgrid [index expression]
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ This is an instance of a class.
+ It can be used to construct a filled
+\begin_inset Quotes eld
+\end_inset
+
+mesh-grid
+\begin_inset Quotes erd
+\end_inset
+
+ using slicing syntax.
+
+\end_layout
+
+\begin_layout Description
+ogrid [index expression]
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ This is similar to mgrid except it returns an open grid, so as to save
+ space and time.
+ The broadcasting rules will ensure that any universal function operating
+ on the grid will act as if the ogrid had been the result of mgrid.
+\end_layout
+
+\begin_layout Description
+r_
+\begin_inset LatexCommand index
+name "r\\_"
+
+\end_inset
+
+ [index expression]
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ This is a simple way to build up arrays quickly.
+ There are two use cases.
+ 1) If the index expression contains comma separated arrays, then stack
+ them along their first axis.
+ 2) If the index expression contains slice notation or scalars then create
+ a 1-d array with a range indicated by the slice notation.
+ In other-words the slice syntax start:stop:step is equivalent to arange(start,
+ stop, step) inside of the brackets.
+ However, if step is an imaginary number (i.e.
+ 100j) then its integer portion is interpreted as a number-of-points desired
+ and the start and stop are inclusive.
+ In other words start:stop:step
+\family typewriter
+j
+\family default
+ is interpreted as linspace(start, stop, step, endpoint=1) inside of the
+ brackets.
+ After expansion of slice notation, all comma separated sequences are concatenat
+ed together.
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Optional character strings placed as the first element of the index expression
+ can be used to change the output.
+ The strings 'r' or 'c' result in matrix output.
+ If the result is 1-d and 'r' is specified a
+\begin_inset Formula $1\times N$
+\end_inset
+
+ (row) matrix is produced.
+ If the result is 1-d and 'c' is specified, then a
+\begin_inset Formula $N\times1$
+\end_inset
+
+ (column) matrix is produced.
+ If the result is 2-d then both provide the same matrix result.
+
+\end_layout
+
+\begin_layout MyCode
+>>> print r_[-1:1:9j,[0]*10,5,6]
+\newline
+[-1.
+ -0.75 -0.5 -0.25 0.
+ 0.25 0.5 0.75 1.
+ 0.
+ 0.
+\newline
+ 0.
+ 0.
+ 0.
+ 0.
+ 0.
+ 0.
+ 0.
+ 0.
+ 5.
+ 6.
+ ]
+\newline
+>>> print r_['r',1,2,5,6]
+\newline
+[[1 2 5 6]]
+\newline
+>>> print r_['c',1,2,5,6]
+\newline
+[[1]
+\newline
+ [2]
+\newline
+
+ [5]
+\newline
+ [6]]
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ A string integer specifies which axis to stack multiple comma separated
+ arrays along.
+
+\end_layout
+
+\begin_layout MyCode
+>>> a=arange(6).reshape(2,3)
+\newline
+>>> r_[a,a]
+\newline
+array([[0, 1, 2],
+\newline
+ [3, 4, 5],
+\newline
+
+ [0, 1, 2],
+\newline
+ [3, 4, 5]])
+\newline
+>>> r_['-1',a,a]
+\newline
+array([[0, 1, 2, 0, 1,
+ 2],
+\newline
+ [3, 4, 5, 3, 4, 5]])
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ A string of two comma-separated integers allows indication of the minimum
+ number of dimensions to force each entry into as the second integer (the
+ axis to concatenate along is still the first integer).
+
+\end_layout
+
+\begin_layout MyCode
+>>> r_['0,2',[1,2,3],[4,5,6]]
+\newline
+array([[1, 2, 3],
+\newline
+ [4, 5, 6]])
+\newline
+>>> r_['1,2',[1,
+2,3],[4,5,6]]
+\newline
+array([[1, 2, 3, 4, 5, 6]])
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ A string with three comma-separated integers allows specification of the
+ axis to concatenate along, the minimum number of dimensions to force the
+ entries to, and which axis should contain the start of the arrays which
+ are less than the specified number of dimensions.
+ In other words the third integer allows you to specify where the the 1's
+ should be placed in the shape of the arrays that have their shapes upgraded.
+ By default, they are placed in the front of the shape tuple.
+ The third argument allows you to specify where the start of the array should
+ be instead.
+ Thus, a third argument of '0' would place the 1's at the end of the array
+ shape.
+ Negative integers specify where in the new shape tuple the last dimension
+ of upgraded arrays should be placed, so the default is '-1'.
+\end_layout
+
+\begin_layout MyCode
+>>> r_['0,2,0', [1,2,3], [4,5,6]]
+\newline
+array([[1],
+\newline
+ [2],
+\newline
+ [3],
+\newline
+
+ [4],
+\newline
+ [5],
+\newline
+ [6]])
+\newline
+>>> r_['1,2,0', [1,2,3], [4,5,6]]
+\newline
+array([[1,
+ 4],
+\newline
+ [2, 5],
+\newline
+ [3, 6]])
+\end_layout
+
+\begin_layout Description
+c_
+\begin_inset LatexCommand index
+name "c\\_"
+
+\end_inset
+
+ [index_expression]
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ This is short-hand for r_['-1,2,0', index_expression] useful because of
+ its common occurence.
+ In particular, arrays will be stacked along their last axis after being
+ upgraded to at least 2-d with 1's post-pended to the shape (column vectors
+ made out of 1-d arrays).
+
+\end_layout
+
+\begin_layout Section
+Other indexing devices
+\end_layout
+
+\begin_layout Description
+index_exp
+\begin_inset LatexCommand index
+name "index\\_exp"
+
+\end_inset
+
+ [index expression]
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Return a tuple of Python objects that implements the index expression and
+ can be modified and placed in any other index expression.
+
+\end_layout
+
+\begin_layout MyCode
+>>> index_exp[2:5,...,4,::-1]
+\newline
+(slice(2, 5, None), Ellipsis, 4, slice(None, None,
+ -1))
+\end_layout
+
+\begin_layout Description
+s_
+\begin_inset LatexCommand index
+name "s\\_"
+
+\end_inset
+
+ [index expression]
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Translate index expressions into the equivalent Python objects.
+ This is similar to index_expression except a tuple is not always returned.
+ For example:
+\end_layout
+
+\begin_layout MyCode
+>>> s_[1:10]
+\newline
+slice(1, 10, None)
+\newline
+>>> s_[1:10,-3:4:0.5]
+\newline
+(slice(1, 10, None), slice(-3,
+ 4, 0.5))
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ This provides a standard way to construct index expressions to pass to
+ functions and methods because Python does not allow slice expressions anywhere
+ except for inside brackets.
+
+\end_layout
+
+\begin_layout Description
+ndindex
+\begin_inset LatexCommand index
+name "ndindex"
+
+\end_inset
+
+ (*seq)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ A sequence of
+\begin_inset Formula $N$
+\end_inset
+
+ integers are passed in as separate arguments.
+ These integers are used as the upper boundaries of an
+\begin_inset Formula $N$
+\end_inset
+
+-dimensional counter that starts at 0.
+ The object returned is an iterator that implements the counter.
+\end_layout
+
+\begin_layout MyCode
+>>> for index in ndindex(3,3,2):
+\newline
+...
+ print index,
+\newline
+(0, 0, 0) (0, 0, 1) (0, 1, 0) (0, 1, 1) (0, 2, 0) (0, 2,
+ 1) (1, 0, 0) (1, 0, 1) (1, 1, 0) (1, 1, 1) (1, 2, 0) (1, 2, 1) (2, 0, 0)
+ (2, 0, 1) (2, 1, 0) (2, 1, 1) (2, 2, 0) (2, 2, 1)
+\end_layout
+
+\begin_layout Description
+unravel_index
+\begin_inset LatexCommand index
+name "unravel\\_index"
+
+\end_inset
+
+ (indx, dims)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Convert a flat index, indx, into an index tuple for an array of the given
+ shape.
+ Keep in mind that it may be more convenient to use indx with a.flat, then
+ to unravel the index.
+\end_layout
+
+\begin_layout Section
+Two-dimensional functions
+\end_layout
+
+\begin_layout Standard
+These functions all deal with or return two dimensional arrays.
+\end_layout
+
+\begin_layout Description
+eye
+\begin_inset LatexCommand index
+name "eye"
+
+\end_inset
+
+ (
+\begin_inset Formula $N$
+\end_inset
+
+,
+\begin_inset Formula $M$
+\end_inset
+
+=None,
+\begin_inset Formula $k$
+\end_inset
+
+=0, dtype=float)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Return an
+\begin_inset Formula $N\times M$
+\end_inset
+
+ array of the given type with ones down the
+\begin_inset Formula $k^{\textrm{th}}$
+\end_inset
+
+ diagonal.
+ If
+\begin_inset Formula $M$
+\end_inset
+
+ is None, it defaults to
+\begin_inset Formula $N$
+\end_inset
+
+.
+ Alternatively, if
+\begin_inset Formula $M$
+\end_inset
+
+ is a valid data type, then it becomes the data-type used.
+
+\end_layout
+
+\begin_layout Description
+vander
+\begin_inset LatexCommand index
+name "vander"
+
+\end_inset
+
+ (
+\begin_inset Formula $x$
+\end_inset
+
+,
+\begin_inset Formula $N$
+\end_inset
+
+=None)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ The Vandermonde matrix of vector,
+\begin_inset Formula $x$
+\end_inset
+
+.
+ The
+\begin_inset Formula $i^{\textrm{th}}$
+\end_inset
+
+ column of the return matrix is the
+\begin_inset Formula $m_{i}^{\textrm{th}}$
+\end_inset
+
+ power of
+\begin_inset Formula $x$
+\end_inset
+
+ where
+\begin_inset Formula $m_{i}=N-i-1$
+\end_inset
+
+.
+ If
+\begin_inset Formula $N$
+\end_inset
+
+ is None, it defaults to the length of
+\begin_inset Formula $x$
+\end_inset
+
+.
+
+\end_layout
+
+\begin_layout MyCode
+>>> vander([1,2,3,4,5],3)
+\newline
+array([[ 1, 1, 1],
+\newline
+ [ 4, 2, 1],
+\newline
+
+ [ 9, 3, 1],
+\newline
+ [16, 4, 1],
+\newline
+ [25, 5, 1]])
+\end_layout
+
+\begin_layout Description
+diag
+\begin_inset LatexCommand index
+name "diag"
+
+\end_inset
+
+ (
+\begin_inset Formula $v$
+\end_inset
+
+,
+\begin_inset Formula $k$
+\end_inset
+
+=0)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Return the
+\begin_inset Formula $k^{\textrm{th}}$
+\end_inset
+
+ diagonal if
+\begin_inset Formula $v$
+\end_inset
+
+ is a 2-d array, or returns an array with
+\begin_inset Formula $v$
+\end_inset
+
+ as the
+\begin_inset Formula $k^{\textrm{th}}$
+\end_inset
+
+ diagonal if
+\begin_inset Formula $v$
+\end_inset
+
+ is a 1-d array.
+
+\end_layout
+
+\begin_layout MyCode
+>>> diag(arange(12).reshape(4,3),k=1)
+\newline
+array([1, 5])
+\newline
+>>> diag([1,4,5,7],k=-1)
+\newline
+array([
+[0, 0, 0, 0, 0],
+\newline
+ [1, 0, 0, 0, 0],
+\newline
+ [0, 4, 0, 0, 0],
+\newline
+ [0,
+ 0, 5, 0, 0],
+\newline
+ [0, 0, 0, 7, 0]])
+\end_layout
+
+\begin_layout Description
+diagflat
+\begin_inset LatexCommand index
+name "diagflat"
+
+\end_inset
+
+ (
+\begin_inset Formula $v$
+\end_inset
+
+,
+\begin_inset Formula $k$
+\end_inset
+
+=0)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Return a 2-d array (of the same class as
+\begin_inset Formula $v$
+\end_inset
+
+) by placing a flattened version of
+\begin_inset Formula $v$
+\end_inset
+
+ along the
+\begin_inset Formula $k^{\textrm{th}}$
+\end_inset
+
+ diagonal.
+ This differs from diag in that it only creates 2-d arrays and will work
+ with any object that can be converted to an array (returning that object
+ if it also defines an __array_wrap__ method).
+
+\end_layout
+
+\begin_layout Description
+fliplr
+\begin_inset LatexCommand index
+name "fliplr"
+
+\end_inset
+
+ (m)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Return the array, m, with rows preserved and columns reversed in the left-right
+ direction.
+ For m.ndim > 2, this works on the first two dimensions (equivalent to m[:,::-1])
+\end_layout
+
+\begin_layout Description
+flipud
+\begin_inset LatexCommand index
+name "flipud"
+
+\end_inset
+
+ (m)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Return the array, m, with columns preserved and rows reversed in the up-down
+ direction.
+ For m.ndim > 1, this works on the first dimension (equivalent to m[::-1])
+\end_layout
+
+\begin_layout Description
+rot90
+\begin_inset LatexCommand index
+name "rot90"
+
+\end_inset
+
+ (m, k=1)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Rotate the first two dimensions of an array, m, by k*90 degrees in the
+ counterclockwise direction.
+ Must have m.ndim >=2.
+\end_layout
+
+\begin_layout Description
+tri
+\begin_inset LatexCommand index
+name "tri"
+
+\end_inset
+
+ (
+\begin_inset Formula $N$
+\end_inset
+
+,
+\begin_inset Formula $M$
+\end_inset
+
+=
+\begin_inset Formula $N$
+\end_inset
+
+, k=0, dtype=aint)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Construct an
+\begin_inset Formula $N\times M$
+\end_inset
+
+ array where all the diagonals starting from the lower left corner up to
+ the
+\begin_inset Formula $\textrm{k}^{\textrm{th}}$
+\end_inset
+
+ diagonal are all ones.
+
+\end_layout
+
+\begin_layout Description
+triu
+\begin_inset LatexCommand index
+name "triu"
+
+\end_inset
+
+ (m, k=0)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Return a upper-triangular 2-d array from m with all the elements below
+ the
+\begin_inset Formula $\textrm{k}^{\textrm{th}}$
+\end_inset
+
+ diagonal set to 0.
+
+\end_layout
+
+\begin_layout Description
+tril
+\begin_inset LatexCommand index
+name "tril"
+
+\end_inset
+
+ (m, k=0)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Return a lower-triangular 2-d array from m with all the elements above
+ the
+\begin_inset Formula $\textrm{k}^{\textrm{th}}$
+\end_inset
+
+ diagonal set to 0.
+
+\end_layout
+
+\begin_layout Description
+mat
+\begin_inset LatexCommand index
+name "mat"
+
+\end_inset
+
+ (data, dtype=None)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Construct a matrix from data.
+ Alias for numpy.asmatrix.
+ The calling syntax is the same as that function.
+ Note that data can be a string in which case the routine uses spaces and
+ semi-colons to construct the matrix:
+\end_layout
+
+\begin_layout MyCode
+>>> mat('1 3 4; 5 6 9')
+\newline
+matrix([[1, 3, 4],
+\newline
+ [5, 6, 9]])
+\end_layout
+
+\begin_layout Description
+bmat
+\begin_inset LatexCommand index
+name "bmat"
+
+\end_inset
+
+ (obj, ldict=None, gdict=None)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Build a matrix from sub-blocks.
+ This is similar to mat, except the items in the nested-sequence, or string,
+ should be appropriately shaped 2-d arrays.
+ If obj is a string, then ldict and gdict can be used to alter where the
+ names represented in the string are found (default is current local and
+ global namespace).
+
+\end_layout
+
+\begin_layout MyCode
+>>> A=mat('1 2; 3 4'); B=mat('5 6; 7 8')
+\newline
+>>> bmat('A, B; B, A')
+\newline
+matrix([[1,
+ 2, 5, 6],
+\newline
+ [3, 4, 7, 8],
+\newline
+ [5, 6, 1, 2],
+\newline
+ [7, 8, 3, 4]])
+\end_layout
+
+\begin_layout Section
+More data type functions
+\end_layout
+
+\begin_layout Description
+issubclass_
+\begin_inset LatexCommand index
+name "issubclass\\_"
+
+\end_inset
+
+ (arg1, arg2)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Returns True if arg1 is a sub-class of arg2, otherwise returns False.
+ Similar to the built-in issubclass except it does not raise an error if
+ arg1 or arg2 are not types.
+
+\end_layout
+
+\begin_layout Description
+issubdtype
+\begin_inset LatexCommand index
+name "issubdtype"
+
+\end_inset
+
+ (arg1, arg2)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Returns True if the type-object of the data-type represented by arg1 is
+ a sub class of the type-object of the data-type represented by arg2.
+\end_layout
+
+\begin_layout Description
+iscomplexobj
+\begin_inset LatexCommand index
+name "iscomplexobj"
+
+\end_inset
+
+ (obj)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Return a single True or False value depending on whether or not obj would
+ be interpreted as an array with complex-valued data type.
+\end_layout
+
+\begin_layout Description
+isrealobj
+\begin_inset LatexCommand index
+name "isrealobj"
+
+\end_inset
+
+ (obj)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Return a single True or False value depending on whether or not obj would
+ be interpreted as an array with real-valued data type.
+\end_layout
+
+\begin_layout Description
+isscalar
+\begin_inset LatexCommand index
+name "isscalar"
+
+\end_inset
+
+ (obj)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ True if obj is a scalar (an instance of an array data type, or a standard
+ Python scalar type).
+ There is also a sequence of called ScalarType defined in NumPy, so that
+ this can also be tested as type(obj) in numpy.ScalarType.
+
+\end_layout
+
+\begin_layout Description
+nan_to_num
+\begin_inset LatexCommand index
+name "nan\\_to\\_num"
+
+\end_inset
+
+ (arr)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Returns an array with non-finite numbers changed to finite numbers.
+ The mapping converts
+\family typewriter
+nan
+\family default
+ to 0,
+\family typewriter
+inf
+\family default
+ to the maximum value for the data type and
+\family typewriter
+-inf
+\family default
+ to the minimum value for the data type.
+\end_layout
+
+\begin_layout Description
+real_if_close
+\begin_inset LatexCommand index
+name "real\\_if\\_close"
+
+\end_inset
+
+ (arr, tol=100)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Return a real arr if arr is complex with imaginary parts less than some
+ tolerance.
+ If tol > 1, then it represents a multiplicative factor on the value of
+ epsilon for the data type of arr.
+\end_layout
+
+\begin_layout Description
+cast
+\begin_inset LatexCommand index
+name "cast"
+
+\end_inset
+
+ [dtype_or_alias] (obj)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Cast obj to an array of the given type.
+ This is equivalent to array(obj, copy=0).astype(dtype_or_alias).
+ When one type is cast to another in this fashion, a very low-level operation
+ takes place.
+ Typically, you get what your C-compiler produces for the cast, but notice
+ that in the case of casting to a bool type, the value becomes either a
+ 0 or a 1.
+
+\end_layout
+
+\begin_layout MyCode
+>>> cast[bool]([1,2,0,4,0]).astype(int)
+\newline
+array([1, 1, 0, 1, 0])
+\end_layout
+
+\begin_layout Description
+asfarray
+\begin_inset LatexCommand index
+name "asfarray"
+
+\end_inset
+
+ (a, dtype=float)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Return an array of inexact data type (floating or complexfloating).
+
+\end_layout
+
+\begin_layout Description
+mintypecode
+\begin_inset LatexCommand index
+name "mintypecode"
+
+\end_inset
+
+ (typechars, typeset='GDFgdf', default='d')
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Return a minimum data type character from typeset that handles all given
+ typechars.
+ The returned type character must correspond to the data type of the smallest
+ size such that an array of the returned type can handle the data from an
+ array of type t for each t in typechars.
+ If the typechars does not intersect with the typeset, then default is returned.
+ If an element of typechars is not a string, then t=asarray(t).dtypechar
+ is applied.
+\end_layout
+
+\begin_layout Description
+finfo
+\begin_inset LatexCommand index
+name "finfo"
+
+\end_inset
+
+ (dtype)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ This class allows exploration of the details of how a floating point number
+ is represented in the computer.
+ It can be instantiated by an inexact data type object (or an alias for
+ one).
+ Complex-valued data types are acceptable and are equivalent to their real-value
+d counterparts.
+ The attributes of the class are
+\end_layout
+
+\begin_deeper
+\begin_layout Description
+nmant The number of bits in the floating point mantissa, or fraction.
+\end_layout
+
+\begin_layout Description
+nexp The number of bits in the floating point exponent
+\end_layout
+
+\begin_layout Description
+machep Exponent of the smallest (most negative) power of 2 that when added
+ to 1.0 gives something different than 1.0.
+
+\end_layout
+
+\begin_layout Description
+eps Floating point precision: 2**machep.
+\end_layout
+
+\begin_layout Description
+precision Number of decimal digits of precision: int(-log10(eps))
+\end_layout
+
+\begin_layout Description
+resolution 10**(-precision)
+\end_layout
+
+\begin_layout Description
+negep Exponent of the smallest power of 2 that, subtracted from 1.0, gives
+ something different than 1.0.
+\end_layout
+
+\begin_layout Description
+epsneg Floating point precision: 2**negep.
+\end_layout
+
+\begin_layout Description
+minexp Smallest (most negative) power of 2 producing
+\begin_inset Quotes eld
+\end_inset
+
+normal
+\begin_inset Quotes erd
+\end_inset
+
+ numbers (no leading zeros in the mantissa).
+
+\end_layout
+
+\begin_layout Description
+tiny The smallest (in magnitude) usable floating point number equal to 2**minexp.
+\end_layout
+
+\begin_layout Description
+maxexp Smallest (positive) power of 2 that causes overflow.
+\end_layout
+
+\begin_layout Description
+max The largest usable floating value: (1-epsneg)* (2**maxep)
+\end_layout
+
+\begin_layout Description
+min The most negative usable floating value: -max
+\end_layout
+
+\end_deeper
+\begin_layout Description
+\InsetSpace ~
+ The most useful attributes are probably eps, max, min, and tiny.
+\end_layout
+
+\begin_layout Section
+Functions that behave like ufuncs
+\end_layout
+
+\begin_layout Standard
+These functions are Python functions built on top of universal functions
+ (ufuncs) and also take optional output arguments.
+ They broadcast like ufuncs but do not have ufunc attributes.
+\end_layout
+
+\begin_layout Description
+fix
+\begin_inset LatexCommand index
+name "fix"
+
+\end_inset
+
+ (x, y=None)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Round x to the nearest integer towards zero.
+\end_layout
+
+\begin_layout Description
+isneginf
+\begin_inset LatexCommand index
+name "isneginf"
+
+\end_inset
+
+ (x, y=None)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ True if
+\begin_inset Formula $x=-\infty$
+\end_inset
+
+.
+ Should be the same as
+\family typewriter
+x==NumPy.NINF
+\family default
+.
+\end_layout
+
+\begin_layout Description
+isposinf
+\begin_inset LatexCommand index
+name "isposinf"
+
+\end_inset
+
+ (x, y=None)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ True if
+\begin_inset Formula $x=+\infty.$
+\end_inset
+
+ Should be the same as
+\family typewriter
+x==NumPy.PINF
+\family default
+.
+\end_layout
+
+\begin_layout Description
+log2
+\begin_inset LatexCommand index
+name "log2"
+
+\end_inset
+
+ (x, y=None)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Compute the logarithm to the base 2 of
+\begin_inset Formula $x.$
+\end_inset
+
+ An optional output array may be provided.
+\end_layout
+
+\begin_layout Section
+Miscellaneous Functions
+\end_layout
+
+\begin_layout Standard
+Some miscellaneous functions are available in NumPy which are included largely
+ for compatibility with MLab of the old Numeric package.
+ One notable difference, however, is that due to a separate implementation
+ of the modified Bessel function, the kaiser window is available without
+ needing a separate library.
+
+\end_layout
+
+\begin_layout Description
+sinc
+\begin_inset LatexCommand index
+name "sinc"
+
+\end_inset
+
+ (
+\begin_inset Formula $x$
+\end_inset
+
+)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Compute the sinc function for
+\begin_inset Formula $x$
+\end_inset
+
+ which can be a scalar or array.
+ The sinc is defined as
+\begin_inset Formula $y=\textrm{sinc}\left(x\right)=\frac{\sin\left(\pi x\right)}{\pi x}$
+\end_inset
+
+ with the caveat that the limiting value (1.0) of the ratio is taken for
+
+\begin_inset Formula $x=0.$
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+i0
+\begin_inset LatexCommand index
+name "i0"
+
+\end_inset
+
+ (
+\begin_inset Formula $x$
+\end_inset
+
+)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Modified Bessel function of the first kind of order 0.
+ Needed to compute the kaiser window.
+ The modified Bessel function is defined as
+\begin_inset Formula \[
+I_{0}\left(x\right)=\frac{1}{\pi}\int_{0}^{\pi}e^{x\cos\theta}d\theta=\sum_{k=0}^{\infty}\frac{x^{2k}}{4^{k}\left(k!\right)^{2}}.\]
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+blackman
+\begin_inset LatexCommand index
+name "blackman"
+
+\end_inset
+
+ (
+\begin_inset Formula $M$
+\end_inset
+
+)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Construct an
+\begin_inset Formula $M$
+\end_inset
+
+-point Blackman smoothing window which is sequence of length
+\begin_inset Formula $M$
+\end_inset
+
+ with values given for
+\begin_inset Formula $n=0\ldots M-1$
+\end_inset
+
+ by
+\begin_inset Formula \[
+w\left[n\right]=0.42-0.5\cos\left(2\pi\frac{n}{M-1}\right)+0.08\cos\left(4\pi\frac{n}{M-1}\right).\]
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+bartlett
+\begin_inset LatexCommand index
+name "bartlett"
+
+\end_inset
+
+ (
+\begin_inset Formula $M$
+\end_inset
+
+)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Construct an
+\begin_inset Formula $M$
+\end_inset
+
+-point Bartlett (triangular) smoothing window as
+\begin_inset Formula \[
+w\left[n\right]=\left\{ \begin{array}{cc}
+2\frac{n}{M-1} & 0\leq n\leq\frac{M-1}{2},\\
+2-2\frac{n}{M-1} & \frac{M-1}{2}<n\leq M-1.\end{array}\right.\]
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+hanning
+\begin_inset LatexCommand index
+name "hanning"
+
+\end_inset
+
+ (
+\begin_inset Formula $M$
+\end_inset
+
+)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Construct an
+\begin_inset Formula $M$
+\end_inset
+
+-point Hanning smoothing window defined as
+\begin_inset Formula \[
+w\left[n\right]=\frac{1}{2}-\frac{1}{2}\cos\left(2\pi\frac{n}{M-1}\right).\]
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+hamming
+\begin_inset LatexCommand index
+name "hamming"
+
+\end_inset
+
+ (
+\begin_inset Formula $M$
+\end_inset
+
+)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Construct an
+\begin_inset Formula $M$
+\end_inset
+
+-point Hamming smoothing window defined for
+\begin_inset Formula $n=0\ldots M-1$
+\end_inset
+
+ as
+\begin_inset Formula \[
+w\left[n\right]=0.54-0.46\cos\left(2\pi\frac{n}{M-1}\right).\]
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ All of the windowing functions are smoothing windows that attempt to balance
+ the inherent trade off between side-lobe height (ringing) and main-lobe
+ width (resolution) in the frequency domain.
+ A rectangular window has the smallest main-lobe width but the largest side-lobe
+ height.
+ A windowing (tapering) function tries to can help trade off main-lobe width
+ By sacrificing a little in resolution using a windowing function These
+ windows can be used to smooth data using the convolve function.
+ Figure
+\begin_inset LatexCommand ref
+reference "cap:window functions"
+
+\end_inset
+
+ shows the windowing functions described so far and their time- and frequency-do
+main behavior.
+
+\end_layout
+
+\begin_layout Standard
+\begin_inset Float figure
+wide false
+sideways false
+status open
+
+\begin_layout Standard
+\begin_inset Graphics
+ filename Figures/fig1.eps
+ lyxscale 48
+ width 49line%
+ keepAspectRatio
+
+\end_inset
+
+
+\hfill
+
+\begin_inset Graphics
+ filename Figures/fig2.eps
+ lyxscale 48
+ width 49line%
+ keepAspectRatio
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+\begin_inset Caption
+
+\begin_layout Standard
+\begin_inset LatexCommand label
+name "cap:window functions"
+
+\end_inset
+
+Blackman, Bartlett, Hanning, and Hamming windows in the time and frequency
+ domain showing the trade-off between main-lobe width and side-lobe height
+ (Figures made with matplotlib).
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ The trade-off between main-lobe and side-lobe has been studied extensively.
+ Solutions that maximize energy in the main-lobe compared to energy in the
+ side-lobes can be found by finding an eigenvector which can be expensive
+ to compute for large window sizes.
+ A good approximation to these prolate-spheroidal windows is the Kaiser
+ window.
+
+\end_layout
+
+\begin_layout Description
+kaiser
+\begin_inset LatexCommand index
+name "kaiser"
+
+\end_inset
+
+ (
+\begin_inset Formula $M$
+\end_inset
+
+,
+\begin_inset Formula $\beta$
+\end_inset
+
+)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Construct an
+\begin_inset Formula $M$
+\end_inset
+
+-point Kaiser smoothing window.
+ The
+\begin_inset Formula $\beta$
+\end_inset
+
+ parameter controls the width of the window (and the frequency-domain side-lobe
+ height and main-lobe width).
+ The window is defined as
+\begin_inset Formula \[
+w\left[n\right]=\frac{1}{I_{0}\left(\beta\right)}I_{0}\left(\beta\sqrt{1-\frac{\left(2n-M-1\right)^{2}}{\left(M-1\right)^{2}}}\right).\]
+
+\end_inset
+
+ There is an empirical relationship between
+\begin_inset Formula $\beta$
+\end_inset
+
+ and the side-lobe height which can be used in FIR filter design.
+ To achieve a side-lobe height of
+\begin_inset Formula $-\alpha$
+\end_inset
+
+dB, the
+\begin_inset Formula $\beta$
+\end_inset
+
+ parameter is
+\begin_inset Formula \[
+\beta=\left\{ \begin{array}{cc}
+0.1002\left(\alpha-8.7\right) & \alpha>50,\\
+0.5842\left(\alpha-21\right)^{0.4}+0.07886\left(\alpha-21\right) & 21\leq\alpha\leq50,\\
+0 & \alpha<21.\end{array}\right.\]
+
+\end_inset
+
+ The length
+\begin_inset Formula $M$
+\end_inset
+
+ of the window determines the transition width.
+ To obtain a transition width of
+\begin_inset Formula $\Delta\omega$
+\end_inset
+
+rad/s the window-length must be at least:
+\begin_inset Formula \[
+M=\frac{\alpha-8}{2.285\Delta\omega}+1.\]
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Section
+Utility functions
+\end_layout
+
+\begin_layout Description
+set_numeric_ops
+\begin_inset LatexCommand index
+name "set\\_numeric\\_ops"
+
+\end_inset
+
+ (<op1>=func1, <op2>=func2, ...)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ This function can be used to alter the operations used for internal array
+ calculations and array special methods.
+ Replaceable operations (and possible entries for <opN>) are add, subtract,
+ multiply, divide, remainder, power, sqrt, negative, absolute, invert, left_shif
+t, right_shift, bitwise_and, bitwise_or, less, less_equal, equal, not_equal,
+ greater, greater_equal, floor_divide, true_divide, logical_or, logical_and,
+ floor, ceil, maximum, and minimum.
+ The example code below changes, then restores, the old Numeric behavior
+ of remainder (which was changed because it was not consistent with Python).
+
+\end_layout
+
+\begin_layout MyCode
+>>> a = array([-3.,-2,-1,0,1,2,3])
+\newline
+>>> print a % -2.1
+\newline
+[-0.9 -2.
+ -1.
+ 0.
+ -1.1 -0.1 -1.2]
+\newline
+>>> oldops = set_numeric_ops(remainder=fmod)
+\newline
+>>> print a %
+ -2.1
+\newline
+[-0.9 -2.
+ -1.
+ 0.
+ 1.
+ 2.
+ 0.9]
+\newline
+>>> newops = set_numeric_ops(**oldops)
+\newline
+>>> print a % -2.1
+\newline
+[-0.9 -2.
+ -1.
+ 0.
+ -1.1 -0.1 -1.2]
+\newline
+>>> print 3 % -2.1 # comparison
+\newline
+-1.2
+\end_layout
+
+\begin_layout Description
+get_include
+\begin_inset LatexCommand index
+name "get\\_include"
+
+\end_inset
+
+ ()
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Return the directory that contains the numpy include files.
+ The numpy.distutils automatically includes this directory in building extensions.
+
+\end_layout
+
+\begin_layout Description
+get_numarray_include
+\begin_inset LatexCommand index
+name "get\\_numarray\\_include"
+
+\end_inset
+
+ (type=None)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Return the directory that contains the numarray compatible C-API include
+ files.
+ If type is not None, then return a list containing both the numarray compatible
+ C-API include files and the numpy include files.
+ The latter form is only needed when building an extension without the use
+ of numpy.distutils.
+
+\end_layout
+
+\begin_layout Description
+deprecate
+\begin_inset LatexCommand index
+name "deprecate"
+
+\end_inset
+
+ (func, oldname, newname)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Return a deprecated function named 'oldname' that has been replaced by
+ 'newname'.
+ This new deprecated function issues a warning before calling the old function.
+ The name and docs of the function are also updated to be oldname instead
+ of the name that func has.
+ Example usage.
+ If you want to deprecate the function named 'old' in favor of a new function
+ named 'new' which has the same calling conention then this could be done
+ with the assignment
+\end_layout
+
+\begin_deeper
+\begin_layout LyX-Code
+old = deprecate(new, 'old', 'new')
+\end_layout
+
+\end_deeper
+\begin_layout Chapter
+Scalar objects
+\end_layout
+
+\begin_layout Standard
+\begin_inset LatexCommand label
+name "cha:Scalar-objects"
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Quotation
+Never worry about numbers.
+ Help one person at a time, and always start with the person nearest you.
+\end_layout
+
+\begin_layout Right Address
+---
+\emph on
+Mother Teresa
+\end_layout
+
+\begin_layout Quotation
+A great many people think they are thinking when they are merely rearranging
+ their prejudices.
+\end_layout
+
+\begin_layout Right Address
+---
+\emph on
+William James
+\end_layout
+
+\begin_layout Standard
+One
+\begin_inset LatexCommand index
+name "array scalars|("
+
+\end_inset
+
+ important new feature of NumPy is the addition of a new scalar object for
+ each of the 21 different data types that an array can have.
+ Do not confuse these scalar objects with the data-type objects.
+ There is one data-type object.
+ It contains a
+\family typewriter
+.type
+\family default
+ attribute which points to the Python type that each element of the array
+ will be returned as
+\begin_inset Foot
+status open
+
+\begin_layout Standard
+with the exception of object data-types which return the underlying object
+ and not a
+\begin_inset Quotes eld
+\end_inset
+
+scalar
+\begin_inset Quotes erd
+\end_inset
+
+ type.
+
+\end_layout
+
+\end_inset
+
+.
+ The built-in data-types point have .
+\family typewriter
+type
+\family default
+ attributes that point to these scalar objects.
+ Five (or six) of these new scalar objects are essentially equivalent to
+ fundamental Python types and therefore inherit from them as well as from
+ the generic array scalar type.
+ The bool_ data type is very similar to the Python BooleanType but does
+ not inherit from it because Python's BooleanType does not allow itself
+ to be inherited from, and on the C-level the size of the actual bool_ data
+ is not the same as a Python Boolean scalar.
+ Table
+\begin_inset LatexCommand ref
+reference "cap:Array-scalar-types"
+
+\end_inset
+
+ shows which array scalars inherit from basic Python types.
+
+\end_layout
+
+\begin_layout Standard
+\begin_inset Float table
+wide false
+sideways false
+status open
+
+\begin_layout Standard
+\begin_inset Caption
+
+\begin_layout Standard
+\begin_inset LatexCommand label
+name "cap:Array-scalar-types"
+
+\end_inset
+
+Array scalar types that inherit from basic Python types.
+ The intc array data type might also inherit from the IntType if it has
+ the same number of bits as the int_ array data type on your platform.
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+\align center
+\begin_inset Tabular
+<lyxtabular version="3" rows="6" columns="2">
+<features>
+<column alignment="center" valignment="top" leftline="true" width="0">
+<column alignment="center" valignment="top" leftline="true" rightline="true" width="0">
+<row topline="true" bottomline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+array data type
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+Python type
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+int_
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+IntType
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+float_
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+FloatType
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+complex_
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+ComplexType
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+str_
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+StringType
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true" bottomline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+unicode_
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+UnicodeType
+\end_layout
+
+\end_inset
+</cell>
+</row>
+</lyxtabular>
+
+\end_inset
+
+
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+The array scalars have the same attributes and methods as arrays and live
+ in a hierarchy of scalar types so they can be easily classified based on
+ their type objects.
+ However, because array scalars are immutable, and attributes change intrinsic
+ properties of the object, the
+\series bold
+array scalar attributes are not settable
+\series default
+.
+\end_layout
+
+\begin_layout Standard
+Array scalars can be detected using the hierarchy of data types.
+ For example,
+\family typewriter
+isinstance(val, generic)
+\family default
+ will return True if val is an array scalar object.
+ Alternatively, what kind of array scalar is present can be determined using
+ other members of the data type hierarchy.
+ Thus, for example
+\family typewriter
+isinstance(val, complexfloating)
+\family default
+ will return True if val is a complex valued type, while
+\family typewriter
+isinstance(val, flexible)
+\family default
+ will return true if val is one of the flexible itemsize array types (string,
+ unicode, void).
+
+\end_layout
+
+\begin_layout Warning
+The bool_ type is not a subclass of the int_ type (the bool_ type is not
+ even a number type).
+ This is different than Python's default implementation of bool as a sub-class
+ of int.
+\end_layout
+
+\begin_layout Section
+Attributes of array scalars
+\end_layout
+
+\begin_layout Standard
+The array scalar objects have an
+\family typewriter
+__array_priority__
+\family default
+ of NPY_SCALAR_PRIORITY (-1,000,000.0).
+ They also do not (yet) have a ctypes attribute.
+ Otherwise, they share the same attributes as arrays:
+\end_layout
+
+\begin_layout Description
+flags
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Returns True for CONTIGUOUS, OWNDATA, FORTRAN, and ALIGNED.
+ Always returns False for WRITEABLE, and UPDATEIFCOPY.
+
+\end_layout
+
+\begin_layout Description
+shape
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Returns ().
+\end_layout
+
+\begin_layout Description
+strides
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Returns ().
+\end_layout
+
+\begin_layout Description
+ndim
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Returns 0.
+\end_layout
+
+\begin_layout Description
+data
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ A read-only buffer object of size self.itemsize,
+\end_layout
+
+\begin_layout Description
+size
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Return 1.
+\end_layout
+
+\begin_layout Description
+itemsize
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ The number of bytes this scalar requires.
+\end_layout
+
+\begin_layout Description
+base
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Returns None.
+\end_layout
+
+\begin_layout Description
+dtype
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Returns data type descriptor corresponding to this array scalar.
+
+\end_layout
+
+\begin_layout Description
+real
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ The real part of the scalar.
+\end_layout
+
+\begin_layout Description
+imag
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ The imaginary part of the scalar (or 0 if this is real).
+\end_layout
+
+\begin_layout Description
+flat
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Return a 1-d iterator object (of size 1).
+\end_layout
+
+\begin_layout Description
+T
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Return a reference to self.
+\end_layout
+
+\begin_layout Description
+__array_interface__
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ The Python-side to the array interface.
+
+\end_layout
+
+\begin_layout Description
+__array_struct__
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ The C-side to the array interface
+\end_layout
+
+\begin_layout Description
+__array_priority__
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ -100.0 (very low-priority).
+
+\end_layout
+
+\begin_layout Description
+__array_wrap__ (obj)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Returns an array scalar from an array
+\end_layout
+
+\begin_layout Section
+Methods of array scalars
+\end_layout
+
+\begin_layout Standard
+Array scalars have exactly the same methods as arrays.
+ The default behavior of these methods is to internally convert the scalar
+ to an equivalent 0-dimensional array and to call the corresponding array
+ method.
+ The exceptions to these rules are given below.
+ In addition, math operations on array scalars are defined so that the same
+ hardware flags are set and used to interpret the results as for ufunc.
+ Therefore the error state used for ufuncs also carries over to the math
+ on array scalars.
+\end_layout
+
+\begin_layout Description
+__new__ (obj)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ The default behavior is to return a new array or array scalar by calling
+ array(obj) with the corresponding data type.
+ There are two situations when this default behavior is delayed until another
+ approach is tried.
+ First, when the array scalar type inherits from a Python type, then the
+ Python types new method is called first and the default method is called
+ only if that approach fails.
+ The second situation is for the
+\family typewriter
+void
+\family default
+ data type where a single integer-like argument will cause a void scalar
+ of that size to be created and initialized to 0.
+
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Notice that because array(obj) is called for new, if obj is a nested sequence,
+ then the return object could actually be an
+\family typewriter
+ndarray
+\family default
+.
+ Thus, arrays of the correct type can also be created by calling the array
+ data type name directly:
+\end_layout
+
+\begin_layout MyCode
+>>> uint32([[5,6,7,8],[1,2,3,4]])
+\newline
+array([[5, 6, 7, 8],
+\newline
+ [1, 2, 3, 4]],
+ dtype=uint32)
+\end_layout
+
+\begin_layout Description
+__array__ (<None>)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Returns a 0-dimensional array of the given data type, or of type(self)
+ if argument is None.
+\end_layout
+
+\begin_layout Description
+__array_wrap__ (array)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Returns a scalar array object from the first-element of the array.
+\end_layout
+
+\begin_layout Description
+__squeeze__ ()
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Returns self.
+\end_layout
+
+\begin_layout Description
+byteswap (<False>)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Trying to set the first (inplace) argument to True raises a ValueError.
+ Otherwise, this returns a new array scalar with the data byteswapped.
+
+\end_layout
+
+\begin_layout Description
+__reduce__ ()
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ This is called to pickle an array scalar.
+ It returns a tuple of (numpy.core.multiarray.scalar, self.dtypestr, obj or
+ self.tostring()) which can be used to reconstruct the scalar on unpickling.
+ Notice that no state is written, because the entire scalar can be constructed
+ from just the string.
+ Also, if this is an object array scalar, then the Python object being reference
+d is written.
+\end_layout
+
+\begin_layout Description
+__setstate__ ()
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Does nothing but return None.
+\end_layout
+
+\begin_layout Description
+setflags ()
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Does nothing, as flags cannot be set for scalars
+\begin_inset LatexCommand index
+name "array scalars|)"
+
+\end_inset
+
+.
+\end_layout
+
+\begin_layout Section
+Defining New Types
+\end_layout
+
+\begin_layout Standard
+There are two ways to effectively define a new type of array.
+ One way is to simply subclass the ndarray and overwrite the methods of
+ interest.
+ This will work to a degree, but internally certain behaviors are fixed
+ by the data type of the array.
+ To fully customize the data type of an array you need to define a new data-type
+ for the array, and register it with NumPy.
+ This new type can only be defined in C.
+ How to define a new data type in C will be discussed in the next part of
+ the book.
+\end_layout
+
+\begin_layout Chapter
+Data-type (
+\family typewriter
+dtype
+\family default
+) Objects
+\end_layout
+
+\begin_layout Quotation
+We cannot expect that all nations will adopt like systems, for conformity
+ is the jailer of freedom and the enemy of growth.
+\end_layout
+
+\begin_layout Right Address
+---
+\emph on
+John F.
+ Kennedy
+\end_layout
+
+\begin_layout Quotation
+What information consumes is rather obvious: it consumes the attention of
+ its recipients.
+ Hence, a wealth of information creates a poverty of attention and a need
+ to allocate that attention efficiently among the overabundance of information
+ sources that might consume it.
+\end_layout
+
+\begin_layout Right Address
+---
+\emph on
+Herbert Simon
+\end_layout
+
+\begin_layout Standard
+\begin_inset LatexCommand label
+name "cha:Data-descriptor-objects"
+
+\end_inset
+
+It
+\begin_inset LatexCommand index
+name "dtype|("
+
+\end_inset
+
+ is important not to confuse the
+\begin_inset Quotes eld
+\end_inset
+
+array-scalars
+\begin_inset Quotes erd
+\end_inset
+
+ with the
+\begin_inset Quotes eld
+\end_inset
+
+data-type objects.
+\begin_inset Quotes erd
+\end_inset
+
+ It is true that an array-scalar can be interpreted as a data-type object
+ and so can be used to refer to the data-type of an array.
+ However, the data-type object is a separate Python object.
+ Every ndarray has an associated data-type object that completely defines
+ the data in the array (including any named fields).
+ For every built-in data-type object there is an associated type object
+ whose instances are the array-scalars.
+ Because of the association between each data-type object and a type-object
+ of the corresponding array scalar, the array-scalar type-objects can also
+ be thought of as data-types.
+ However, for the type objects of flexible array-scalars (string, unicode_,
+ and void), the type-objects alone are not enough to specify the full data-type
+ because the length is not given.
+ The data-type constructor,
+\series bold
+numpy.dtype
+\series default
+, converts any object that can be considered as a data-type into a data-type
+ object which is the actual object an ndarray looks to in order to interpret
+ each element of its data region.
+ Whenever a data-type is required in a NumPy function or method, supplying
+ a dtype object is always fastest.
+ If the object supplied is not a dtype object, then it will be converted
+ to one using dtype(obj).
+ Therefore, understanding data-type objects is the key to understanding
+ how data types are really represented and understood in NumPy.
+\end_layout
+
+\begin_layout Section
+Attributes
+\begin_inset LatexCommand index
+name "dtype!attributes|("
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+type
+\begin_inset LatexCommand index
+name "dtype!attributes!type"
+
+\end_inset
+
+ The
+\begin_inset LatexCommand index
+name "The"
+
+\end_inset
+
+ type object used to instantiate a scalar of this data-type.
+\end_layout
+
+\begin_layout Description
+kind
+\begin_inset LatexCommand index
+name "dtype!attributes!kind"
+
+\end_inset
+
+ A character code (one of 'biufcSUV') identifying the general kind of data.
+
+\end_layout
+
+\begin_layout Description
+char
+\begin_inset LatexCommand index
+name "dtype!attributes!char"
+
+\end_inset
+
+ A unique character code for each of the 21 different built-in types.
+
+\end_layout
+
+\begin_layout Description
+num
+\begin_inset LatexCommand index
+name "dtype!attributes!num"
+
+\end_inset
+
+ A unique number for each of the 21 different built-in types roughly ordered
+ from least-to-most precision.
+
+\end_layout
+
+\begin_layout Description
+str
+\begin_inset LatexCommand index
+name "dtype!attributes!str"
+
+\end_inset
+
+ The array-protocol typestring of this data-type object.
+\end_layout
+
+\begin_layout Description
+name
+\begin_inset LatexCommand index
+name "dtype!attributes!name"
+
+\end_inset
+
+ A bit-width name for this data-type (un-sized flexible data-type objects
+ are missing the width).
+
+\end_layout
+
+\begin_layout Description
+byteorder
+\begin_inset LatexCommand index
+name "dtype!attributes!byteorder"
+
+\end_inset
+
+ A character indicating the byte-order of this data-type object ('=' : native,
+ '<' : little-endian, '>' : big-endian, '|' : not applicable).
+ All built-in data-type objects have byteorder either '=' or '|'.
+
+\end_layout
+
+\begin_layout Description
+itemsize
+\begin_inset LatexCommand index
+name "dtype!attributes!itemsize"
+
+\end_inset
+
+ The element size of this data-type object.
+ For 18 of the 21 types this number is fixed by the data-type.
+ For the flexible data-types, this number can be anything.
+
+\end_layout
+
+\begin_layout Description
+alignment
+\begin_inset LatexCommand index
+name "dtype!attributes!alignment"
+
+\end_inset
+
+ The required alignment (in bytes) of this data-type according to the compiler.
+ More information is available in the C-API section.
+
+\end_layout
+
+\begin_layout Description
+fields
+\begin_inset LatexCommand index
+name "dtype!attributes!fields"
+
+\end_inset
+
+ A dictionary showing any named fields that have been defined for this data-type
+ (or None if there are no named fields).
+ Fields can be assigned to any built-in data-type (
+\emph on
+e.g.
+
+\emph default
+ using the tuple input to the dtype constructor).
+ However, fields are most useful for (subtypes of) void data-types which
+ can be any size.
+ Fields are a convenient way to keep track of fixed-size sub-parts of the
+ total fixed-size array-element, or record.
+ A field is defined in terms of another dtype object and an offset (in bytes)
+ into the current record.
+
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ The fields dictionary is indexed by keys that are the names of the fields.
+ Each entry in the dictionary is a tuple fully describing the field: (dtype,
+ offset[, title]).
+ If present, the optional title can actually be any object (if it is string
+ or unicode then it will also be a key in the fields dictionary, otherwise
+ it's meta-data).
+ Notice also, that the first two elements of the tuple can be passed directly
+ as arguments to the getfield and setfield attributes of an ndarray.
+ If field names are not specified in a constructor, they default to 'f0',
+ 'f2', ..., 'f<n-1>'.
+
+\end_layout
+
+\begin_layout Description
+names
+\begin_inset LatexCommand index
+name "dtype!attributes!char"
+
+\end_inset
+
+ An ordered list of field names.
+ This can be used to walk through all of the named fields in offset order.
+ Notice that the defined fields do not have to
+\begin_inset Quotes eld
+\end_inset
+
+cover
+\begin_inset Quotes erd
+\end_inset
+
+ the record, but the itemsize of the container data-type object must always
+ be at least as large as the itemsizes of the data-type objects in the defined
+ fields.
+ This attribute is None if there are no fields.
+\end_layout
+
+\begin_layout Description
+subdtype
+\begin_inset LatexCommand index
+name "dtype!attributes!subdtype"
+
+\end_inset
+
+ Numarray introduced the concept of a fixed-length record having fields
+ that were themselves arrays of another data-type.
+ This is supported at a fundamental level in NumPy using this attribute
+ which maintains the simplicity of defining a field by another data-type
+ object.
+ It either returns None or a tuple (base dtype, shape) where shape is a
+ tuple showing the size of the C-contiguous array and the base dtype object
+ indicates the data-type in each element of the subarray.
+ If a field whose dtype object has this attribute is retrieved, then the
+ extra dimensions implied by the shape are tacked on to the end of the retrieved
+ array.
+
+\end_layout
+
+\begin_layout Description
+descr
+\begin_inset LatexCommand index
+name "dtype!attributes!descr"
+
+\end_inset
+
+ An array-interface-compliant full description of the data-type.
+ The format is that required by the 'descr' key in the __array_interface__.
+\end_layout
+
+\begin_layout Description
+isbuiltin
+\begin_inset LatexCommand index
+name "dtype!attributes!isbuiltin"
+
+\end_inset
+
+ A 1 if self is one of the built-in dtype objects; a 2 if self is a user-defined
+ dtype object; a 0, otherwise.
+\end_layout
+
+\begin_layout Description
+isnative
+\begin_inset LatexCommand index
+name "dtype!attributes!isnative"
+
+\end_inset
+
+ True if this data-type object has a byteorder that is native to the platform;
+ otherwise False.
+\end_layout
+
+\begin_layout Description
+hasobject
+\begin_inset LatexCommand index
+name "dtype!attributes!hasobject"
+
+\end_inset
+
+ True if self contains reference-counted objects in any of it's fields or
+ sub data-types.
+ Recall that what is actually in the ndarray memory representing the Python
+ object is the memory address of that object (a pointer).
+ Special handling may be required and this attribute is useful for distinguishin
+g data-types that may contain arbitrary Python objects and data-types that
+ won't.
+
+\end_layout
+
+\begin_layout Description
+flags
+\begin_inset LatexCommand index
+name "dtype!attributes!flags"
+
+\end_inset
+
+ Bit-flags for the data-type describing how the data-type will be interpreted.
+ Bit-masks are in numpy.core.multiarray as the constants ITEM_HASOBJECT, LIST_PICK
+LE, ITEM_IS_POINTER, NEEDS_INIT, NEEDS_PYAPI, USE_GETITEM, USE_SETITEM.
+ A full explanation of these flags is in the second part of this book.
+ These flags are largely useful for user-defined data-types.
+
+\begin_inset LatexCommand index
+name "dtype!attributes|)"
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Section
+Construction
+\end_layout
+
+\begin_layout Description
+dtype (obj, align=0, copy=0)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+
+\begin_inset LatexCommand index
+name "dtype!construction|("
+
+\end_inset
+
+Return a new data-type object from obj.
+ The keyword argument, align, can only be nonzero if obj is a dictionary,
+ or a comma-separated string.
+ If it is non-zero in those cases it is used to add padding as needed to
+ the fields to match what the compiler that compiled NumPy would do to a
+ similar C-struct.
+ The copy argument guarantees a new copy of the data-type object, otherwise,
+ the result may just be a reference to a built-in data-type object.
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Objects that can be converted to a data-type object are described in the
+ following list.
+ Because every object in this list can be converted to a data-type object
+ it can also be used whenever a
+\family typewriter
+dtype
+\family default
+ is requested by a function or method in NumPy.
+
+\end_layout
+
+\begin_deeper
+\begin_layout Description
+dtype
+\begin_inset LatexCommand index
+name "dtype!construction!from float"
+
+\end_inset
+
+Returns itself.
+\end_layout
+
+\begin_layout Description
+None
+\begin_inset LatexCommand index
+name "dtype!construction!from None"
+
+\end_inset
+
+Returns the default data-type descriptor object: float.
+\end_layout
+
+\begin_layout Description
+type-object
+\begin_inset LatexCommand index
+name "dtype!construction!from type"
+
+\end_inset
+
+Many Python type objects can be converted to data-type objects.
+\end_layout
+
+\begin_deeper
+\begin_layout Enumerate
+Array-scalar types: The type-objects of the 21 built-in array scalars all
+ convert to an associated data-type object.
+ This is true for sub-classes as well.
+ Not all data-type information can be supplied with a type-object.
+ Flexible data-types with default itemsizes of 0, for example, require an
+ itemsize to be useful.
+\end_layout
+
+\begin_deeper
+\begin_layout Description
+Examples: int32, float64, uint16, complex128
+\end_layout
+
+\end_deeper
+\begin_layout Enumerate
+Generic types: The generic hierarchical type objects convert to corresponding
+ dtype objects according to the associations: (numeric, inexact, floating)
+ --> float; complexfloating --> cfloat; (integer, signedinteger) --> int_;
+ unsignedinteger --> uint; character --> string; (generic, flexible) -->
+ void.
+
+\end_layout
+
+\begin_layout Enumerate
+Builtin types: Several python types are equivalent to a corresponding array
+ scalar when used to generate a dtype object: int --> int_; bool --> bool_;
+ float --> float_; complex --> cfloat; str --> string; unicode --> unicode_;
+ buffer --> void; (all others) --> object_.
+\end_layout
+
+\begin_deeper
+\begin_layout Description
+Examples: object, str, float, int
+\end_layout
+
+\end_deeper
+\begin_layout Enumerate
+Any type object with the dtype attribute: The attribute will be accessed
+ and used directly.
+ The attribute must return something that is convertible into a dtype object.
+
+\end_layout
+
+\end_deeper
+\begin_layout Description
+string
+\begin_inset LatexCommand index
+name "dtype!construction!from string"
+
+\end_inset
+
+Several kinds of strings can be converted.
+ Recognized strings can be pre-pended with '>', or '<', to specify the byteorder.
+\end_layout
+
+\begin_deeper
+\begin_layout Enumerate
+One-character strings: Each built-in data-type has a character code (the
+ updated Numeric typecodes), that uniquely identifies it.
+
+\end_layout
+
+\begin_deeper
+\begin_layout Description
+Examples: 'b', 'H', 'f', 'd', 'F', 'D', Float64, Int32, UInt16
+\end_layout
+
+\end_deeper
+\begin_layout Enumerate
+Array-protocol type strings: The first character specifies the kind of data
+ and the remaining characters specify how many bytes of data.
+ The supported kinds are 'b' --> Boolean, 'i' --> (signed) integer, 'u'
+ --> unsigned integer, 'f' --> floating-point, 'c' --> complex-floating
+ point, 'S', 'a' --> string, 'U' --> unicode, 'V' --> anything (void).
+
+\end_layout
+
+\begin_deeper
+\begin_layout Description
+Examples: 'i4', 'f8', 'c16', 'b1', 'S10', 'a25'
+\end_layout
+
+\end_deeper
+\begin_layout Enumerate
+Comma-separated field formats: numarray introduced a short-hand notation
+ for specifying the format of a record as a comma-separated string of basic
+ formats.
+ A basic format in this context is an optional shape specifier followed
+ by an array-protocol type string.
+ Parenthesis are required on the shape if it is greater than 1-d.
+ NumPy allows a modification on the format in that any string that can uniquely
+ identify the type can be used to specify the data-type in a field.
+ This data-type defines fields named 'f0', 'f2', ..., 'f<N-1>' where N (>1)
+ is the number of comma-separated basic formats in the string.
+ If the optional shape specifier is provided, then the data-type for the
+ corresponding field contains a subdtype attribute providing the shape.
+
+\end_layout
+
+\begin_deeper
+\begin_layout Description
+Examples:
+\begin_inset Quotes eld
+\end_inset
+
+i4, (2,3)f8, f4
+\begin_inset Quotes erd
+\end_inset
+
+;
+\begin_inset Quotes eld
+\end_inset
+
+a3, 3u8, (3,4)a10
+\begin_inset Quotes erd
+\end_inset
+
+
+\end_layout
+
+\end_deeper
+\begin_layout Enumerate
+Any string in NumPy.sctypeDict.keys():
+\end_layout
+
+\begin_deeper
+\begin_layout Description
+Examples: 'uint32', 'Int16', 'Uint64', 'Float64', 'Complex64'
+\end_layout
+
+\end_deeper
+\end_deeper
+\begin_layout Description
+tuple
+\begin_inset LatexCommand index
+name "dtype!construction!from tuple"
+
+\end_inset
+
+Three kinds of tuples each of length 2 can be converted into a data-type
+ object:
+\end_layout
+
+\begin_deeper
+\begin_layout Enumerate
+(flexible dtype, itemsize): The first argument must be an object that is
+ converted to a flexible data-type object (one whose element size is 0),
+ the second argument is an integer providing the desired itemsize.
+\end_layout
+
+\begin_deeper
+\begin_layout Description
+Examples: (void, 10); (str, 35), ('U', 10)
+\end_layout
+
+\end_deeper
+\begin_layout Enumerate
+(fixed dtype, shape): The first argument is any object that can be converted
+ into a fixed-size data-type object.
+ The second argument is the desired shape of this type.
+ If the shape parameter is 1, then the data-type object is equivalent to
+ fixed dtype.
+\end_layout
+
+\begin_deeper
+\begin_layout Description
+Examples: (int32, (2,5)); ('S10', 1)=='S10'; ('i4, (2,3)f8, f4', (2,3))
+\end_layout
+
+\end_deeper
+\begin_layout Enumerate
+(base dtype, new dtype): Both arguments must be convertible to data-type
+ objects in this case.
+ The base dtype is the data-type object that the new data-type builds on.
+ This is how you could assign named fields to any built-in data-type object.
+
+\end_layout
+
+\begin_deeper
+\begin_layout Description
+Examples: (int32, {'real':(int16,0), 'imag':(int16,2)}); (int32, (int8,
+ 4));
+\newline
+('i4', [('r','u1'),('g','u1'),('b','u1'),('a','u1')])
+\end_layout
+
+\end_deeper
+\end_deeper
+\begin_layout Description
+list
+\begin_inset LatexCommand index
+name "dtype!construction!from list"
+
+\end_inset
+
+(array description interface): This style is more fully described at
+\begin_inset LatexCommand url
+name "this site"
+target "http://numpy.scipy.org/array_interface.html"
+
+\end_inset
+
+.
+ It consists of a list of fields where each field is described by a tuple
+ of length 2 or 3.
+ The first element of the tuple is the field name (if this is '' then a
+ standard field name, 'f#', is assigned).
+ The field name may also be a 2-tuple of strings where the first string
+ is either a
+\begin_inset Quotes eld
+\end_inset
+
+title
+\begin_inset Quotes erd
+\end_inset
+
+ (which may be any string or unicode string) or meta-data for the field
+ which can be any object, and the second string is the
+\begin_inset Quotes eld
+\end_inset
+
+name
+\begin_inset Quotes erd
+\end_inset
+
+ which must be a valid Python identifier.
+ The second element of the tuple can be anything that can be interpreted
+ as a data-type.
+ The optional third element of the tuple contains the shape if this field
+ represents an array of the data-type in the second element.
+ This style does not accept align=1 as it is assumed that all of the memory
+ is accounted for by the array interface description.
+ See the web-page for more examples.
+ Note that a 3-tuple with a third argument equal to 1 is equivalent to a
+ 2-tuple.
+\end_layout
+
+\begin_layout Description
+Examples: [('big','>i4'), ('little','<i4')]; [('R','u1'), ('G','u1'), ('B','u1')
+, ('A','u1')]
+\end_layout
+
+\begin_layout Description
+dictionary
+\begin_inset LatexCommand index
+name "dtype!construction!from dict"
+
+\end_inset
+
+There are two dictionary styles.
+ The first is a standard dictionary format while the second accepted format
+ allows the fields attribute of dtype objects to be interpreted as a data-type.
+
+\end_layout
+
+\begin_deeper
+\begin_layout Enumerate
+names and formats: This style has two required and two optional keys.
+ The 'names' and 'formats' keys are required.
+ Their respective values are equal-length lists with the field names and
+ the field formats.
+ The field names must be strings and the field formats can be any object
+ accepted by dtypedescr constructor.
+ The optional keys in the dictionary are 'offsets' and 'titles' and their
+ values must each be lists of the same length as the 'names' and 'formats'
+ lists.
+ The 'offsets' value is a list of integer offsets for each field, while
+ the 'titles' value is a list of titles for each field (None can be used
+ if no title is desired for that field).
+ The titles can be any string or unicode object and will add another entry
+ to the fields dictionary keyed by the title and referencing the same field
+ tuple which will contain the title as an additional tuple member.
+
+\end_layout
+
+\begin_deeper
+\begin_layout Description
+Examples: {'names': ['r','g','b','a'], 'formats': [uint8, uint8, uint8,
+ uint8]}; {'names':['r','b'], 'formats': ['u1', 'u1'], 'offsets': [0, 2],
+ 'titles': ['Red pixel', 'Blue pixel']}
+\end_layout
+
+\end_deeper
+\begin_layout Enumerate
+data-type object fields: This style is patterned after the format of the
+ fields dictionary in a data-type object.
+ It contains string or unicode keys that refer to (data-type, offset) or
+ (data-type, offset, title) tuples.
+
+\end_layout
+
+\begin_deeper
+\begin_layout Description
+Examples: {'col1': ('S10', 0), 'col2': (float32, 10), 'col3': (int, 14)}
+\begin_inset LatexCommand index
+name "dtype!construction|)"
+
+\end_inset
+
+
+\end_layout
+
+\end_deeper
+\end_deeper
+\end_deeper
+\begin_layout Section
+Methods
+\begin_inset LatexCommand index
+name "dtype!methods|("
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+newbyteorder
+\begin_inset LatexCommand index
+name "dtype!methods!newbyteorder"
+
+\end_inset
+
+(<'swap'>)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Construct a new copy of self with its byteorder changed according to the
+ optional argument.
+ All changes are also propagated to the data-type objects of all fields
+ and sub-arrays.
+ If a byteorder of '|' (meaning ignore) is encountered it is left unchanged.
+ The default behavior is to swap the byteorder.
+ Other possible arguments are 'big' ('>'), 'little' ('<'), and 'native'
+ ('=') which recursively forces the byteorder of self (and it's field data-type
+ objects and any sub-arrays) to the corresponding byteorder.
+
+\end_layout
+
+\begin_layout Description
+__reduce__
+\begin_inset LatexCommand index
+name "dtype!methods!\\_\\_reduce\\_\\_"
+
+\end_inset
+
+ ()
+\end_layout
+
+\begin_layout Description
+__setstate__
+\begin_inset LatexCommand index
+name "dtype!methods!\\_\\_setstate\\_\\_"
+
+\end_inset
+
+ (state)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Data-type objects can be pickled because of these two methods.
+ The __reduce__() method returns a 3-tuple consisting of (callable object,
+ args, state), where the callable object is numpy.core.multiarray.dtype and
+ args is (typestring, 0, 1) unless the data-type inherits from void (or
+ is user-defined) in which case args is (typeobj, 0, 1).
+ The state is an 8-tuple with (version, endian, self.subdtype, self.names,
+ self.fields, self.itemsize, self.alignment, self.flags).
+ The self.itemsize and self.alignment entries are both -1 if the data-type
+ object is built-in and not flexible (because they are fixed on creation).
+ The setstate method takes the saved state and updates the date-type
+\begin_inset LatexCommand index
+name "dtype!methods|)"
+
+\end_inset
+
+object.
+\begin_inset LatexCommand index
+name "dtype|)"
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Chapter
+Standard Classes
+\end_layout
+
+\begin_layout Quotation
+To generalize is to be an idiot.
+
+\end_layout
+
+\begin_layout Right Address
+---
+\emph on
+William Blake
+\end_layout
+
+\begin_layout Quotation
+Not everything that can be counted counts, and not everything that counts
+ can be counted.
+\end_layout
+
+\begin_layout Right Address
+---
+\emph on
+Albert Einstein
+\end_layout
+
+\begin_layout Standard
+\begin_inset LatexCommand index
+name "ndarray!subtyping|("
+
+\end_inset
+
+The ndarray in NumPy is a
+\begin_inset Quotes eld
+\end_inset
+
+new-style
+\begin_inset Quotes erd
+\end_inset
+
+ Python built-in-type.
+ Therefore, it can be inherited from (in Python or in C) if desired.
+ Therefore, it can form a foundation for many useful classes.
+ Often whether to sub-class the array object or to simply use the core array
+ component as an internal part of a new class is a difficult decision, and
+ can be simply a matter of choice.
+ NumPy has several tools for simplifying how your new object interacts with
+ other array objects, and so the choice may not be significant in the end.
+ One way to simplify the question is by asking yourself if the object you
+ are interested can be replaced as a single array or does it really require
+ two or more arrays at it's core.
+ For example, in the standard NumPy distribution, the matrix and records
+ classes inherit from the ndarray, while masked arrays use two ndarrays
+ as objects of its internal structure.
+\end_layout
+
+\begin_layout Standard
+Note that asarray(a) always returns the base-class ndarray.
+ If you are confident that your use of the array object can handle any subclass
+ of an ndarray, then asanyarray(a) can be used to allow subclasses to propagate
+ more cleanly through your subroutine.
+ In principal a subclass could redefine any aspect of the array and therefore,
+ under strict guidelines, asanyarray(a) would rarely be useful.
+ However, most subclasses of the arrayobject will not redefine certain aspects
+ of the array object such as the buffer interface, or the attributes of
+ the array.
+ One of important example, however, of why your subroutine may not be able
+ to handle an arbitrary subclass of an array is that matrices redefine the
+ '*' operator to be matrix-multiplication, rather than element-by-element
+ multiplication.
+\end_layout
+
+\begin_layout Section
+Special attributes and methods recognized by NumPy
+\begin_inset LatexCommand index
+name "ndarray!attributes!recognized by|("
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+__array_finalize__ (obj)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ This method is called whenever the system internally allocates a new array
+ from obj, where obj is a subclass (subtype) of the (big)ndarray.
+ It can be used to change attributes of self after construction (so as to
+ ensure a 2-d matrix for example), or to update meta-information from the
+
+\begin_inset Quotes eld
+\end_inset
+
+parent.
+\begin_inset Quotes erd
+\end_inset
+
+ Subclasses inherit a default implementation of this method that does nothing.
+\end_layout
+
+\begin_layout Description
+__array_wrap__ (array)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ This method should return an instance of the class from the ndarray object
+ passed in.
+ For example, this is called after every ufunc for the object with the highest
+ __array_priority__.
+ The ufunc-computed array object is passed in and whatever is returned is
+ passed to the user.
+ Subclasses inherit a default implementation of this method.
+\end_layout
+
+\begin_layout Description
+__array__ (dtype <None>)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ This method is called to obtain an ndarray object when needed.
+ You should always guarantee this returns an actual ndarray object.
+ Subclasses inherit a default implementation of this method.
+
+\end_layout
+
+\begin_layout Description
+__array_priority__
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ The value of this attribute is used to determine what type of object to
+ return in situations where there is more than one possibility for the Python
+ type of the returned object.
+ Subclasses inherit a default value of 1.0 for this attribute.
+\begin_inset LatexCommand index
+name "ndarray!attributes!recognized by|)"
+
+\end_inset
+
+
+\begin_inset LatexCommand index
+name "ndarray!subtyping|)"
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Section
+Matrix Objects
+\end_layout
+
+\begin_layout Standard
+\begin_inset LatexCommand index
+name "matrix|("
+
+\end_inset
+
+Matrix objects inherit from the ndarray and therefore, they have the same
+ attributes and methods of ndarrays.
+ There are six important differences of matrix objects, however that may
+ lead to unexpected results when you use matrices but expect them to act
+ like arrays:
+\end_layout
+
+\begin_layout Enumerate
+Matrix objects can be created using a string notation to allow Matlab-style
+ syntax where spaces separate columns and semicolons (';') separate rows.
+
+\end_layout
+
+\begin_layout Enumerate
+Matrix objects are always two-dimensional.
+ This has far-reaching implications, in that m.ravel() is still two-dimensional
+ (with a 1 in the first dimension) and item selection returns two-dimensional
+ objects so that sequence behavior is fundamentally different than arrays.
+\end_layout
+
+\begin_layout Enumerate
+Matrix objects over-ride multiplication to be matrix-multiplication.
+
+\series bold
+Make sure you understand this for functions that you may want to receive
+ matrices.
+ Especially in light of the fact that asanyarray(m) returns a matrix when
+ m is a matrix.
+\end_layout
+
+\begin_layout Enumerate
+Matrix objects over-ride power to be matrix raised to a power.
+ The same warning about using power inside a function that uses asanyarray(...)
+ to get an array object holds for this fact.
+
+\end_layout
+
+\begin_layout Enumerate
+The default __array_priority__ of matrix objects is 10.0, and therefore mixed
+ operations with ndarrays always produce matrices.
+
+\end_layout
+
+\begin_layout Enumerate
+Matrices have special attributes which make calculations easier.
+ These are
+\end_layout
+
+\begin_deeper
+\begin_layout Enumerate
+.T --- return the transpose of self
+\end_layout
+
+\begin_layout Enumerate
+.H --- return the conjugate transpose of self
+\end_layout
+
+\begin_layout Enumerate
+.I --- return the inverse of self
+\end_layout
+
+\begin_layout Enumerate
+.A --- return a view of the data of self as a 2d array (no copy is done).
+\end_layout
+
+\end_deeper
+\begin_layout Warning
+Matrix objects over-ride multiplication, '*', and power, '**', to be matrix-mult
+iplication and matrix power, respectively.
+ If your subroutine can accept sub-classes and you do not convert to base-class
+ arrays, then you must use the ufuncs multiply and power to be sure that
+ you are performing the correct operation for all inputs.
+
+\end_layout
+
+\begin_layout Standard
+The matrix class is a Python subclass of the ndarray and can be used as
+ a reference for how to construct your own subclass of the ndarray.
+ Matrices can be created from other matrices, strings, and anything else
+ that can be converted to an
+\family typewriter
+ndarray
+\family default
+.
+ The name
+\begin_inset Quotes eld
+\end_inset
+
+mat
+\begin_inset Quotes erd
+\end_inset
+
+ is an alias for
+\begin_inset Quotes eld
+\end_inset
+
+matrix
+\begin_inset Quotes erd
+\end_inset
+
+ in NumPy.
+\end_layout
+
+\begin_layout Description
+Example\InsetSpace ~
+1: Matrix creation from a string
+\end_layout
+
+\begin_layout MyCode
+>>> a=mat('1 2 3; 4 5 3')
+\newline
+>>> print (a*a.T).I
+\newline
+[[ 0.2924 -0.1345]
+\newline
+ [-0.1345 0.0819]]
+\end_layout
+
+\begin_layout Description
+Example\InsetSpace ~
+2: Matrix creation from nested sequence
+\end_layout
+
+\begin_layout MyCode
+>>> mat([[1,5,10],[1.0,3,4j]])
+\newline
+matrix([[ 1.+0.j, 5.+0.j, 10.+0.j],
+\newline
+ [
+ 1.+0.j, 3.+0.j, 0.+4.j]])
+\end_layout
+
+\begin_layout Description
+Example\InsetSpace ~
+3: Matrix creation from an array
+\end_layout
+
+\begin_layout MyCode
+>>> mat(random.rand(3,3)).T
+\newline
+matrix([[ 0.7699, 0.7922, 0.3294],
+\newline
+ [ 0.2792,
+ 0.0101, 0.9219],
+\newline
+ [ 0.3398, 0.7571, 0.8197]])
+\end_layout
+
+\begin_layout Description
+matrix (data, dtype=None, copy=True)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ The sequence to convert to a matrix is passed in as data.
+ If dtype is None, then the data-type is determined from the data.
+ If copy is True, then a copy of the data is made, otherwise, the same data
+ buffer is used.
+ If no buffer can be found for data, then a copy is also made.
+ Note: The matrix object is actually a class and so using this syntax calls
+ matrix.__new__(matrix, data, dtype, copy) which is what happens whenever
+ you
+\begin_inset Quotes eld
+\end_inset
+
+call
+\begin_inset Quotes erd
+\end_inset
+
+ any class object as a function.
+\end_layout
+
+\begin_layout Description
+mat
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Just another name for matrix.
+\end_layout
+
+\begin_layout Description
+asmatrix (data, dtype=None)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Returns the data without copying.
+ Equivalent to matrix(data, dtype, copy=False).
+\end_layout
+
+\begin_layout Description
+bmat (obj, ldict=None, gdict=None)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Build a matrix object from a string, nested sequence or an array.
+ This command lets you build up matrices from other other objects.
+ The ldict and gdict parameters are local and module (global) dictionaries
+ that are only used when obj is a string.
+ If they are not provided, then the local and module dictionaries present
+ when bmat is called are used.
+\begin_inset LatexCommand index
+name "matrix|)"
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout MyCode
+>>> A = mat('2 2; 2 2'); B=mat('1 1; 1 1');
+\newline
+>>> print bmat('A B; B A')
+\newline
+[[2
+ 2 1 1]
+\newline
+ [2 2 1 1]
+\newline
+ [1 1 2 2]
+\newline
+ [1 1 2 2]]
+\end_layout
+
+\begin_layout Section
+Memory-mapped-file arrays
+\end_layout
+
+\begin_layout Standard
+\begin_inset LatexCommand index
+name "memory maps|("
+
+\end_inset
+
+Memory-mapped files are useful for reading and/or modifying small segments
+ of a large file with regular layout, without reading the entire file into
+ memory.
+ A simple subclass of the ndarray uses a memory-mapped file for the data
+ buffer of the array.
+ For small files, the over-head of reading the entire file into memory is
+ typically not significant, however for large files using memory mapping
+ can save considerable resources.
+
+\end_layout
+
+\begin_layout Note
+Memory-mapped arrays use the the Python memory-map object which (prior to
+ Python 2.5) does not allow files to be larger than a certain size depending
+ on the platform.
+ This size is always < 2GB even on 64-bit systems.
+
+\end_layout
+
+\begin_layout Standard
+The class is called memmap and is available in the NumPy namespace.
+ The __new__ method of the class has been re-written to have the following
+ syntax:
+\end_layout
+
+\begin_layout Description
+__new__ (cls, filename, dtype=uint8, mode='r+', offset=0, shape=None, order=0)
+
+\end_layout
+
+\begin_deeper
+\begin_layout Description
+filename The file name to be used as the array data buffer
+\end_layout
+
+\begin_layout Description
+dtype A data-type object used to interpret the file contents (including
+ byteorder).
+\end_layout
+
+\begin_layout Description
+mode The mode to open the file in.
+ Valid modes are 'readonly' or 'r', 'copyonwrite' or 'c', 'readwrite' or
+ 'r+', and 'write' or 'w+'.
+ This mode determines the WRITEABLE flag of the returned array.
+\end_layout
+
+\begin_layout Description
+offset An offset into the file to start the array data.
+\end_layout
+
+\begin_layout Description
+shape The desired shape of the array.
+ If this is None, then the returned array will be 1-d with the number of
+ elements determined by the file size and data type.
+\end_layout
+
+\begin_layout Description
+order Either 'C' or 'Fortran' to indicate the order that an N-D array should
+ be interpreted.
+ This only has an effect if the shape is greater than 2-D.
+\end_layout
+
+\end_deeper
+\begin_layout Standard
+Memory-mapped-file arrays have one additional method (besides those they
+ inherit from the ndarray): self.
+\series bold
+sync
+\series default
+() which must be called manually by the user to ensure that any changes
+ to the array actually get written to disk.
+
+\end_layout
+
+\begin_layout Description
+Example:
+\end_layout
+
+\begin_layout MyCode
+>>> a = memmap('newfile.dat', dtype=float, mode='w+', shape=1000)
+\newline
+>>> a[10]
+ = 10.0
+\newline
+>>> a[30] = 30.0
+\newline
+>>> del a
+\newline
+>>> b = fromfile('newfile.dat', dtype=float)
+\newline
+>>>
+ print b[10], b[30]
+\newline
+10.0 30.0
+\newline
+>>> a = memmap('newfile.dat', dtype=float)
+\newline
+>>> print
+ a[10], a[30]
+\newline
+10.0 30.0
+\end_layout
+
+\begin_layout Section
+Character arrays (numpy.char)
+\end_layout
+
+\begin_layout Standard
+\begin_inset LatexCommand index
+name "character arrays|("
+
+\end_inset
+
+These are enhanced arrays of either string type or unicode_ type.
+ These arrays inherit from the ndarray, but specially-define the operations
+ +, *, and % on a (broadcasting) element-by-element basis.
+ These operations are not available on the standard ndarray of character
+ type.
+ In addition, the chararray has all of the standard string (and unicode)
+ methods, executing them on an element-by-element basis.
+ Perhaps the easiest way to create a chararray is to use self.view(chararray)
+ where self is an ndarray of string or unicode data-type.
+ However, a chararray can also be created using the numpy.chararray.__new__
+ method.
+\end_layout
+
+\begin_layout Description
+__new__ (shape, itemsize, unicode=False, buffer=None, offset=0, strides=None,
+ order=None)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Create a new character array of string or unicode type and itemsize characters.
+ Create the array using buffer (with offset and strides) if it is not None.
+ If buffer is None, then construct a new array with strides in Fortran order
+ if len(shape) >=2 and order is 'Fortran' (otherwise the strides will be
+ in 'C' order).
+
+\end_layout
+
+\begin_layout Description
+char.array (obj, itemsize=None, copy=True, unicode=False, order=None)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Create a chararray from the nested sequence obj.
+ If obj is an ndarray of data-type unicode_ or string, then its data is
+ wrapped by the chararray object and converted to the desired type (string
+ or unicode).
+
+\end_layout
+
+\begin_layout Standard
+Another difference with the standard ndarray of string data-type is that
+ the chararray inherits the feature introduced by Numarray that white-space
+ at the end of any element in the array will be ignored on item retrieval
+ and comparison operations.
+
+\begin_inset LatexCommand index
+name "character arrays|)"
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Section
+Record Arrays (numpy.rec)
+\end_layout
+
+\begin_layout Standard
+\begin_inset LatexCommand index
+name "record arrays|("
+
+\end_inset
+
+NumPy provides a powerful data-type object that allows any ndarray to hold
+ (arbitrarily nested) record-like items with named-field access to the sub-types.
+ This is possible without any special record-array sub-class.
+ Consider the example where each item in the array is a simple record of
+ name, age, and weight.
+ You could specify a data-type for an array of such records using the following
+ data-type object:
+\end_layout
+
+\begin_layout MyCode
+>>> desc = dtype({'names': ['name', 'age', 'weight'], 'formats': ['S30',
+ 'i2', 'f4']})
+\newline
+>>> a = array([('Bill',31,260.0),('Fred', 15, 145.0)],dtype=desc)
+\newline
+>>>
+ print a[0]
+\newline
+('Bill', 31, 260.0)
+\newline
+>>> print a['name']
+\newline
+['Bill' 'Fred']
+\newline
+>>> print
+ a['age']
+\newline
+[31 15]
+\newline
+>>> print a['weight']
+\newline
+[ 260.
+ 145.]
+\newline
+>>> print a[0]['name'], a[0]['age'], a[0]['weight']
+\newline
+Bill 31 260.0
+\newline
+>>>
+ print len(a[0])
+\newline
+3
+\end_layout
+
+\begin_layout Standard
+This example shows how a general array can be assigned named fields and
+ how these fields can be accessed.
+ In this case the a[0] object is an array-scalar of type void.
+ The void array-scalars are unique in that they contain references to (rather
+ than copies of) the underlying data whenever fields are defined.
+ Therefore, the record data can be modified in place:
+\end_layout
+
+\begin_layout MyCode
+>>> a[0]['name'] = 'George'; print a
+\newline
+[('George', 31, 260.0) ('Fred', 15, 145.0)]
+\end_layout
+
+\begin_layout Standard
+The recarray subclass and its accompanying record item add the ability to
+ access named fields through attribute lookup.
+ A quick way to get a record array is to use the view method of the ndarray.
+
+\end_layout
+
+\begin_layout MyCode
+>>> r = a.view(recarray)
+\newline
+>>> print r.name
+\newline
+['George' 'Fred']
+\end_layout
+
+\begin_layout Standard
+The numpy.core.records module (aliased to nump.rec when numpy is imported)
+ contains additional convenience functions for constructing record arrays.
+ All of the following constructors have two different mechanisms for specifying
+ the data-type.
+ Either the dtype= argument can be specified or the argument formats= can
+ be specified along with an optional set of four additional keyword arguments
+ (names=, titles=, aligned= and byteorder=).
+ In some cases neither dtype= nor formats= is required as the data-type
+ can be inferred from the object passed in as the first argument.
+\end_layout
+
+\begin_layout Standard
+The five argument method for specifying a data-type constructs a data-type
+ object internally.
+ The comma-separated formats string is used to specify the fields.
+ The names (and optional titles) of the fields can be specified by a comma-separ
+ated string of names (or titles).
+ The aligned flag determines whether the fields are packed (False) or padded
+ (True) according to the platform compiler rules.
+ The byteorder argument allows specification of the byte-order for all of
+ the fields at once (they can also be specified individually in the formats
+ string).
+ The default byte-order is native to the platform.
+
+\end_layout
+
+\begin_layout Description
+array (obj, dtype=None, shape=None, offset=0, strides=None, formats=None,
+ names=None, titles=None, aligned=False, byteorder=None, copy=True)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ A general-purpose record array constructor that is a front-end to the other
+ constructors If obj is None, then call the
+\series bold
+recarray
+\series default
+ constructor.
+ If obj is a string, then call the
+\series bold
+fromstring
+\series default
+ constructor.
+ If obj is a list or a tuple then if the first object is an ndarray, then
+ call
+\series bold
+fromarrays
+\series default
+, otherwise call
+\series bold
+fromrecords
+\series default
+.
+ If obj is a recarray, then make a copy of the data in recarray (if copy
+ is True) and use the new formats, names, and titles.
+ If obj is a file then call
+\series bold
+fromfile
+\series default
+.
+ Finally, if obj is an ndarray, then return obj.view(recarray) and make a
+ copy of the data if copy is True.
+ Otherwise, call the __array_interface__ attribute and try to convert using
+ the information returned from that object.
+ Either dtype or the formats argument must be given if obj is None, a string,
+ or a file, and if obj is None so the recarray constructor will be called,
+ then shape must be given as well.
+
+\end_layout
+
+\begin_layout Description
+fromarrays (array_list, dtype=None, shape=None, formats=None, names=None,
+ titles=None, aligned=False, byteorder=None)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Create a record array from a (flat) list of ndarrays.
+ The data from the arrays will be copied into the fields.
+ If formats is None and dtype is None, then the formats will be determined
+ from the arrays.
+ The names and titles arguments can be a list, tuple or a (comma-separated)
+ string specifying the names and/or titles to use for the fields.
+ If aligned is True, then the structure will be padded according to the
+ rules of the compiler that NumPy was compiled with.
+\end_layout
+
+\begin_layout MyCode
+>>> x1 = array([21,32,14])
+\newline
+>>> x2 = array(['my','first','name'])
+\newline
+>>> x3 =
+ array([3.1, 4.5, 6.2])
+\newline
+>>> r = rec.fromarrays([x1,x2,x3], names='id, word, number')
+\newline
+>
+>> print r[1]
+\newline
+(32, 'first', 4.5)
+\newline
+>>> r.number
+\newline
+array([ 3.1, 4.5, 6.2])
+\newline
+>>> r.word
+\newline
+chararra
+y(['my', 'first', 'name'],
+\newline
+ dtype='|S5')
+\end_layout
+
+\begin_layout Description
+fromrecords (rec_list, dtype=None, shape=None, formats=None, names=None,
+ titles=None, aligned=False, byteorder=None)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Construct a record array from a (nested) sequence of tuples that define
+ the records.
+ If formats are not given, they are deduced from the records, but this is
+ slower.
+ The field names and field titles can be specified.
+ If aligned is non-zero, then the record array is padded so that fields
+ are aligned as the platform compiler would do if the fields represented
+ a C-struct.
+\end_layout
+
+\begin_layout MyCode
+>>> recs = [('Bill', 31, 260.0), ('Fred', 15, 145.0)]
+\newline
+>>> r = rec.fromrecords(recs,
+ formats='S30,i2,f4', names='name, age, weight')
+\newline
+>>> print r.name
+\newline
+['Bill' 'Fred']
+\newline
+>>
+> print r.age
+\newline
+[31 15]
+\newline
+>>> print r.weight
+\newline
+[ 260.
+ 145.]
+\end_layout
+
+\begin_layout Description
+fromstring (datastring, dtype=None, shape=None, offset=0, formats=None,
+ names=None, titles=None, aligned=0, byteorder=None):
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Construct a record array using the provided datastring (at the given offset)
+ as the memory.
+ The record array will be read-only.
+ The byteorder argument may be used to specify the byteorder of all of the
+ fields at the same time.
+ A True aligned argument causes padding fields to be added as needed so
+ that the fields are aligned on boundaries determined by the compiler.
+ The shape of the returned array can also be specified.
+
+\end_layout
+
+\begin_layout Description
+fromfile (fd, dtype=None, shape=None, offset=0, formats=None, names=None,
+ titles=None, aligned=False, byteorder=None)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Construct a record array from the (binary) data in the given file object,
+ fd.
+ This object may be an open file or a string to indicate a file to read
+ from.
+ If offset is non-zero, then data is read from the file at offset bytes
+ from the current position.
+
+\end_layout
+
+\begin_layout Standard
+The following classes are also available in the numpy.core (and therefore
+ the numpy) namespace
+\end_layout
+
+\begin_layout Description
+record A subclass of the void array scalar type that allows field access
+ using attributes.
+
+\end_layout
+
+\begin_layout Description
+recarray A subclass of the ndarray that allows field access using attributes
+\end_layout
+
+\begin_deeper
+\begin_layout Description
+__new__ (subtype, shape, formats, names=None, titles=None, buf=None, offset=0,
+ strides=None, byteorder=None, aligned=0)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Construct an array of the given subtype and shape with data-type (record,
+ dtype) where dtype is constructed from formats, names, and titles.
+ If buf is None, then create new memory.
+ Otherwise, use the memory of buf exposed through the buffer protocol.
+\end_layout
+
+\end_deeper
+\begin_layout Description
+format_parser A class useful for creating a data-type descriptor from formats,
+ names, titles, and aligned arguments.
+ This is used by several of the record array constructors for consistency
+ in behavior.
+
+\end_layout
+
+\begin_deeper
+\begin_layout Description
+__init__ (self, formats, names, titles, aligned=False, byteorder=None)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Construct a data-type object from formats, names, titles, aligned, and
+ byteorder arguments.
+ Upon completion the constructed data-type object is in self._descr.
+
+\begin_inset LatexCommand index
+name "record arrays|)"
+
+\end_inset
+
+
+\end_layout
+
+\end_deeper
+\begin_layout Section
+Masked Arrays (numpy.ma)
+\end_layout
+
+\begin_layout Standard
+\begin_inset LatexCommand index
+name "masked arrays|("
+
+\end_inset
+
+These are adapted from the masked arrays provided with Numeric.
+ Masked Arrays do not inherit from the ndarray, they simply use two ndarray
+ objects in their internal representation.
+ Fortunately, as I have not used masked arrays in my work, Paul Dubois (the
+ original author of MA for Numeric) adapted and modified the code for use
+ by NumPy.
+ Alexander Belopolsky (Sasha) added additional functions and improvements
+
+\end_layout
+
+\begin_layout Standard
+Masked arrays are created using the masked array creation function.
+
+\end_layout
+
+\begin_layout Description
+ma.array (data, dtype=None, copy=True, order='C', mask=ma.nomask, fill_value=None)
+\end_layout
+
+\begin_deeper
+\begin_layout Description
+data Something that can be converted to an array.
+ If data is already a masked array, then if mask is ma.nomask, the mask used
+ be data.mask and the data used data.data.
+
+\end_layout
+
+\begin_layout Description
+dtype The data-type of the underlying array
+\end_layout
+
+\begin_layout Description
+copy If copy is False, then every effort will be made to not copy the data.
+
+\end_layout
+
+\begin_layout Description
+order Specify whether the array is in 'C', 'Fortran', or 'Any' order
+\end_layout
+
+\begin_layout Description
+mask Masked values are excluded from calculations.
+ If this is ma.nomask, then there are no masked values.
+ Otherwise, this should be an object that is convertible to an array of
+ Booleans with the same shape as data.
+\end_layout
+
+\begin_layout Description
+fill_value This value is used to fill in masked values when necessary.
+ The fill_value is not used for computation for functions within the ma
+ module.
+\end_layout
+
+\end_deeper
+\begin_layout Standard
+Masked arrays have the same methods and attributes as arrays with the addition
+ of the mask attribute as well as the
+\begin_inset Quotes eld
+\end_inset
+
+hidden
+\begin_inset Quotes erd
+\end_inset
+
+ attributes ._data and ._mask.
+
+\begin_inset LatexCommand index
+name "masked arrays|)"
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Section
+Standard container class
+\end_layout
+
+\begin_layout Standard
+\begin_inset LatexCommand index
+name "user\\_array"
+
+\end_inset
+
+
+\begin_inset LatexCommand index
+name "container class"
+
+\end_inset
+
+For backward compatibility and as a standard
+\begin_inset Quotes eld
+\end_inset
+
+container
+\begin_inset Quotes erd
+\end_inset
+
+ class, the UserArray from Numeric has been brought over to NumPy and named
+
+\series bold
+numpy.lib.user_array.container
+\series default
+ The container class is a Python class whose self.array attribute is an ndarray.
+ Multiple inheritance is probably easier with numpy.lib.user_array.container
+ than with the ndarray itself and so it is included by default.
+ It is not documented here beyond mentioning its existence because you are
+ encouraged to use the ndarray class directly if you can.
+
+\end_layout
+
+\begin_layout Section
+Array Iterators
+\end_layout
+
+\begin_layout Standard
+\begin_inset LatexCommand index
+name "array iterator"
+
+\end_inset
+
+Iterators are a powerful concept for array processing.
+ Essentially, iterators implement a generalized for-loop.
+ If myiter is an iterator object, then the Python code
+\end_layout
+
+\begin_layout LyX-Code
+for val in myiter:
+\end_layout
+
+\begin_layout LyX-Code
+ ...
+\end_layout
+
+\begin_layout LyX-Code
+ some code involving val
+\end_layout
+
+\begin_layout LyX-Code
+ ...
+\end_layout
+
+\begin_layout Standard
+calls val=myiter.next() repeatedly until StopIteration is raised by the iterator.
+ There are several ways to iterate over an array that may be useful: default
+ iteration, flat iteration, and
+\begin_inset Formula $N$
+\end_inset
+
+-dimensional enumeration.
+\end_layout
+
+\begin_layout Subsection
+Default iteration
+\end_layout
+
+\begin_layout Standard
+The default iterator of an ndarray object is the default Python iterator
+ of a sequence type.
+ Thus, when the array object itself is used as an iterator.
+ The default behavior is equivalent to:
+\end_layout
+
+\begin_layout LyX-Code
+for i in arr.shape[0]:
+\end_layout
+
+\begin_layout LyX-Code
+ val = arr[i]
+\end_layout
+
+\begin_layout Standard
+This default iterator selects a sub-array of dimension
+\begin_inset Formula $N-1$
+\end_inset
+
+ from the array.
+ This can be a useful construct for defining recursive algorithms.
+ To loop over the entire array requires
+\begin_inset Formula $N$
+\end_inset
+
+ for-loops.
+
+\end_layout
+
+\begin_layout MyCode
+>>> a = arange(24).reshape(3,2,4)+10
+\newline
+>>> for val in a:
+\newline
+...
+ print 'item:', val
+\newline
+item: [[10 11 12 13]
+\newline
+ [14 15 16 17]]
+\newline
+item: [[18 19
+ 20 21]
+\newline
+ [22 23 24 25]]
+\newline
+item: [[26 27 28 29]
+\newline
+ [30 31 32 33]]
+\end_layout
+
+\begin_layout Subsection
+Flat iteration
+\end_layout
+
+\begin_layout Standard
+As mentioned previously, the flat attribute of ndarray objects returns an
+ iterator that will cycle over the entire array in C-style contiguous order.
+
+\end_layout
+
+\begin_layout MyCode
+>>> for i, val in enumerate(a.flat):
+\newline
+...
+ if i%5 == 0: print i, val
+\newline
+0 10
+\newline
+5 15
+\newline
+10 20
+\newline
+15 25
+\newline
+20 30
+\end_layout
+
+\begin_layout Standard
+Here, I've used the built-in enumerate iterator to return the iterator index
+ as well as the value.
+\end_layout
+
+\begin_layout Subsection
+N-dimensional enumeration
+\end_layout
+
+\begin_layout Standard
+Sometimes it may be useful to get the N-dimensional index while iterating.
+ The ndenumerate iterator can achieve this.
+\end_layout
+
+\begin_layout MyCode
+>>> for i, val in ndenumerate(a):
+\newline
+...
+ if sum(i)%5 == 0: print i, val
+\newline
+(0, 0, 0) 10
+\newline
+(1, 1, 3) 25
+\newline
+(2, 0, 3) 29
+\newline
+(2,
+ 1, 2) 32
+\end_layout
+
+\begin_layout Subsection
+Iterator for broadcasting
+\end_layout
+
+\begin_layout Standard
+The general concept of broadcasting is also available from Python using
+ the
+\series bold
+broadcast
+\series default
+ iterator.
+ This object takes
+\begin_inset Formula $N$
+\end_inset
+
+ objects as inputs and returns an iterator that returns tuples providing
+ each of the input sequence elements in the broadcasted result.
+\end_layout
+
+\begin_layout MyCode
+>>> for val in broadcast([[1,0],[2,3]],[0,1]):
+\newline
+...
+ print val
+\newline
+(1, 0)
+\newline
+(0, 1)
+\newline
+(2, 0)
+\newline
+(3, 1)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ The methods and attributes of the broadcast object are:
+\end_layout
+
+\begin_deeper
+\begin_layout Description
+nd the number of dimensions in the broadcasted result.
+\end_layout
+
+\begin_layout Description
+shape the shape of the broadcasted result.
+\end_layout
+
+\begin_layout Description
+size the total size of the broadcasted result.
+\end_layout
+
+\begin_layout Description
+index the current (flat) index into the broadcasted array
+\end_layout
+
+\begin_layout Description
+iters a tuple of (broadcasted) NumPy.flatiter objects, one for each array.
+\end_layout
+
+\begin_layout Description
+reset ()
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Reset the multiter object to the beginning.
+\end_layout
+
+\begin_layout Description
+next ()
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Get the next tuple of objects from the (broadcasted) arrays
+\end_layout
+
+\end_deeper
+\begin_layout Chapter
+Universal Functions
+\end_layout
+
+\begin_layout Standard
+\begin_inset LatexCommand label
+name "par:The-Ufunc-Object"
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Quotation
+Computers make it easier to do a lot of things, but most of the things they
+ make it easier to do don't need to be done.
+\end_layout
+
+\begin_layout Right Address
+---
+\emph on
+Andy Rooney
+\end_layout
+
+\begin_layout Quotation
+People think computers will keep them from making mistakes.
+ They're wrong.
+ With computers you make mistakes faster.
+\end_layout
+
+\begin_layout Right Address
+---
+\emph on
+Adam Osborne
+\end_layout
+
+\begin_layout Section
+Description
+\end_layout
+
+\begin_layout Standard
+\begin_inset LatexCommand index
+name "ufunc|("
+
+\end_inset
+
+Universal functions are wrappers that provide a common interface to mathematical
+ functions that operate on scalars, and can be made to operate on arrays
+ in an element-by-element fashion.
+ All
+\family typewriter
+u
+\family default
+niversal
+\family typewriter
+func
+\family default
+tion
+\family typewriter
+s
+\family default
+ (
+\family typewriter
+ufuncs
+\family default
+) wrap some core function that takes
+\begin_inset Formula $n_{i}$
+\end_inset
+
+ (scalar) inputs and produces
+\begin_inset Formula $n_{o}$
+\end_inset
+
+ (scalar) outputs.
+ Typically, this core function is implemented in compiled code but a Python
+ function can also be wrapped into a universal function using the basic
+ method
+\family typewriter
+frompyfunc
+\family default
+ in the umath module.
+
+\end_layout
+
+\begin_layout Description
+frompyfunc (func, nin, nout)
+\begin_inset LatexCommand index
+name "frompyfunc"
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ This function returns a new universal function wrapping a Python function
+ func with nin inputs and nout outputs.
+ The resulting universal function works using Object arrays for both input
+ and output.
+ The vectorize class makes use of frompyfunc internally.
+ You can view the source code using numpy.source(numpy.vectorize).
+\end_layout
+
+\begin_layout Subsection
+Broadcasting
+\end_layout
+
+\begin_layout Standard
+\begin_inset LatexCommand index
+name "broadcasting"
+
+\end_inset
+
+Each universal function takes array inputs and produces array outputs by
+ performing the core function element-wise on the inputs.
+ The standard broadcasting rules are applied so that inputs without exactly
+ the same shapes can still be usefully operated on.
+ Broadcasting can be understood by four rules:
+\end_layout
+
+\begin_layout Enumerate
+All input arrays with ndim smaller than the input array of largest ndim
+ have 1's pre-pended to their shapes.
+\end_layout
+
+\begin_layout Enumerate
+The size in each dimension of the output shape is the maximum of all the
+ input shapes in that dimension.
+\end_layout
+
+\begin_layout Enumerate
+An input can be used in the calculation if it's shape in a particular dimension
+ either matches the output shape or has value exactly 1.
+\end_layout
+
+\begin_layout Enumerate
+If an input has a dimension size of 1 in its shape, the first data entry
+ in that dimension will be used for all calculations along that dimension.
+ In other words, the stepping machinery of the ufunc will simply not step
+ along that dimension when otherwise needed (the stride will be 0 for that
+ dimension).
+
+\end_layout
+
+\begin_layout Standard
+While perhaps a bit difficult to explain, broadcasting can be quite useful
+ and becomes second nature rather quickly.
+ Broadcasting is used throughout NumPy to decide how to handle non equally-shape
+d arrays.
+
+\end_layout
+
+\begin_layout Subsection
+Output type determination
+\end_layout
+
+\begin_layout Standard
+The output of the ufunc (and its methods) does not have to be an ndarray.
+ All output arrays will be passed to the __array_wrap__ method of any input
+ (besides ndarrays, and scalars) that defines it
+\series bold
+and
+\series default
+ has the highest __array_priority__ of any other input to the universal
+ function.
+ The default __array_priority__ of the ndarray is 0.0, and the default __array_pr
+iority__ of a subtype is 1.0.
+ Matrices have __array_priority__ equal to 10.0.
+
+\end_layout
+
+\begin_layout Standard
+The ufuncs can also all take output arguments.
+ The output will be cast if necessary to the provided output array.
+ If a class with an __array__ method is used for the output, results will
+ be written to the object returned by __array__.
+ Then, if the class also has an __array_wrap__ method, the returned
+\family typewriter
+ndarray
+\family default
+ result will be passed to that method just before passing control back to
+ the caller.
+
+\end_layout
+
+\begin_layout Subsection
+Use of internal buffers
+\end_layout
+
+\begin_layout Standard
+Internally, buffers are used for misaligned data, swapped data, and data
+ that has to be converted from one data type to another.
+ The size of the internal buffers is settable on a per-thread basis.
+ There can be up to
+\begin_inset Formula $2\left(n_{i}+n_{o}\right)$
+\end_inset
+
+ buffers of the specified size created to handle the data from all the inputs
+ and outputs of a ufunc.
+ The default size of the buffer is 10,000 elements.
+ Whenever buffer-based calculation would be needed, but all input arrays
+ are smaller than the buffer size, those misbehaved or incorrect typed arrays
+ will be copied before the calculation proceeds.
+ Adjusting the size of the buffer may therefore alter the speed at which
+ ufunc calculations of various sorts are completed.
+ A simple interface for setting this variable is accessible using the function
+
+\end_layout
+
+\begin_layout Description
+setbufsize (size)
+\begin_inset LatexCommand index
+name "setbufsize"
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Set the buffer size to the given number of elements in the current thread.
+ Return the old buffer size (so that it can be reset later if desired).
+
+\end_layout
+
+\begin_layout Subsection
+Error handling
+\end_layout
+
+\begin_layout Standard
+\begin_inset LatexCommand index
+name "error handling"
+
+\end_inset
+
+Universal functions can trip special floating point status registers in
+ your hardware (such as divide-by-zero).
+ If available on your platform, these registers will be regularly checked
+ during calculation.
+ The user can determine what should be done if errors are encountered.
+ Error handling is controlled on a per-thread basis.
+ Four errors can be individually configured: divide-by-zero, overflow, underflow
+, and invalid.
+ The errors can each be set to ignore, warn, raise, or call.
+ The easiest way to configure the error mask is using the function
+\end_layout
+
+\begin_layout Description
+seterr (all=None, divide=None, over=None, under=None, invalid=None)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+
+\begin_inset LatexCommand index
+name "seterr"
+
+\end_inset
+
+This will set the current thread so that errors can be handled if desired.
+ If one of the errors is set to 'call', then a function must be provided
+ using the seterrcall() routine.
+ If any of the arguments are None, then that error mask will be unchanged.
+ The return value of this function is a dictionary with the old error conditions.
+ Thus, you can restore the old condition after you are finished with your
+ function by calling seterr(**old).
+ If all is set, then all errors will be set to the specified value.
+
+\end_layout
+
+\begin_layout Description
+seterrcall (callable)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+
+\begin_inset LatexCommand index
+name "seterrcall"
+
+\end_inset
+
+This sets the function to call when an error is triggered for an error condition
+ configured with the
+\begin_inset Quotes eld
+\end_inset
+
+call
+\begin_inset Quotes erd
+\end_inset
+
+ handler.
+ This function should take two arguments: a string showing the type of error
+ that triggered the call, and an integer showing the state of the floating
+ point status registers.
+ Any return value of the call function will be ignored, but errors can be
+ raised by the function.
+ Only one error function handler can be specified for all the errors.
+ The status argument shows which errors were raised.
+ The return value of this routine is the old callable.
+ The argument passed in to this function must be any callable object with
+ the right signature or None.
+
+\end_layout
+
+\begin_layout Note
+FPE_DIVIDEBYZERO, FPE_OVERFLOW, FPE_UNDERFLOW, and FPE_INVALID, are all
+ defined constants in NumPy.
+ The status flag returned for a 'call' error handling type shows which errors
+ were raised by adding these constants together.
+\end_layout
+
+\begin_layout Subsection
+Optional keyword arguments
+\end_layout
+
+\begin_layout Standard
+\begin_inset LatexCommand index
+name "ufunc!keyword arguments"
+
+\end_inset
+
+All ufuncs take optional keyword arguments.
+ These represent rather advanced usage and will likely not be used by most
+ users.
+
+\end_layout
+
+\begin_layout Description
+sig= either a data-type, a tuple of data-types, or a special signature string
+ indicating the input and output types of a ufunc.
+ This argument allows you to specify a specific signature for a the 1-d
+ loop to use in the underlying calculation.
+ If the loop specified does not exist for the ufunc, then a TypeError is
+ raised.
+ Normally a suitable loop is found automatically by comparing the input
+ types with what is available and searching for a loop with data-types to
+ which all inputs can be cast safely.
+ This key-word argument lets you by-pass that search and choose a loop you
+ want.
+ A list of available signatures is available in the
+\series bold
+types
+\series default
+ attribute of the ufunc object.
+
+\end_layout
+
+\begin_layout Description
+extobj= a list of length 1, 2, or 3 specifying the ufunc buffer-size, the
+ error mode integer, and the error call-back function.
+ Normally, these values are looked-up in a thread-specific dictionary.
+ Passing them here bypasses that look-up and uses the low-level specification
+ provided for the error-mode.
+ This may be useful as an optimization for calculations requiring lots of
+ ufuncs on small arrays in a loop.
+
+\end_layout
+
+\begin_layout Section
+Attributes
+\end_layout
+
+\begin_layout Standard
+\begin_inset LatexCommand index
+name "ufunc!attributes"
+
+\end_inset
+
+There are some informational attributes that universal functions possess.
+ None of the attributes can be set.
+
+\end_layout
+
+\begin_layout Description
+__doc__
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ A docstring for each ufunc.
+ The first part of the docstring is dynamically generated from the number
+ of outputs, the name, and the number of inputs.
+ The second part of the doc string is provided at creation time and stored
+ with the ufunc.
+
+\end_layout
+
+\begin_layout Description
+__name__
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ The name of this ufunc.
+\end_layout
+
+\begin_layout Description
+nin
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ The number of inputs
+\end_layout
+
+\begin_layout Description
+nout
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ The number of outputs
+\end_layout
+
+\begin_layout Description
+nargs
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ The total number of inputs + outputs
+\end_layout
+
+\begin_layout Description
+ntypes
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ The total number of different types for which this ufunc is defined.
+\end_layout
+
+\begin_layout Description
+types
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ A list of length ntypes containing strings showing the types for which
+ this ufunc is defined.
+ Other types may still be used as inputs (and as output arrays), they will
+ just need casting.
+ For inputs, standard casting rules will be used to determine which of the
+ supplied internal functions that will be used (and therefore the default
+ type of the output).
+ Results will always be force-cast to any array provided to hold the output.
+
+\end_layout
+
+\begin_layout Description
+identity
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ A 1, 0, or None to show the identity for this universal function.
+ This identity is used for reduction on zero-sized arrays (arrays with a
+ shape that includes a 0).
+\end_layout
+
+\begin_layout Standard
+\begin_inset Float table
+wide false
+sideways false
+status open
+
+\begin_layout Standard
+\begin_inset Caption
+
+\begin_layout Standard
+Universal function (ufunc) attributes.
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+\align center
+\begin_inset Tabular
+<lyxtabular version="3" rows="9" columns="2">
+<features>
+<column alignment="center" valignment="top" leftline="true" width="0">
+<column alignment="center" valignment="top" leftline="true" rightline="true" width="0">
+<row topline="true" bottomline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+Name
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+Description
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+__doc__
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+Dynamic docstring.
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+__name__
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+Name of ufunc
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+nin
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+Number of input arguments
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+nout
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+Number of output arguments
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+nargs
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+Total number of arguments
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+ntypes
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+Number of defined inner loops.
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+types
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+List showing types for which inner loop is defined.
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true" bottomline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+identity
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+Identity for this ufunc.
+\end_layout
+
+\end_inset
+</cell>
+</row>
+</lyxtabular>
+
+\end_inset
+
+
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Section
+Casting Rules
+\end_layout
+
+\begin_layout Standard
+\begin_inset LatexCommand index
+name "ufunc!casting rules"
+
+\end_inset
+
+At the core of every ufunc is a one-dimensional strided loop that implements
+ the actual function for a specific type combination.
+ When a ufunc is created, it is given a static list of inner loops and a
+ corresponding list of type signatures over which the ufunc operates.
+ The ufunc machinery uses this list to determine which inner loop to use
+ for a particular case.
+ You can inspect the
+\family typewriter
+.types
+\family default
+ attribute for a particular ufunc to see which type combinations have a
+ defined inner loop and which output type they produce (the character codes
+ are used in that output for brevity).
+
+\end_layout
+
+\begin_layout Standard
+Casting must be done on one or more of the inputs whenever the ufunc does
+ not have a core loop implementation for the input types provided.
+ If an implementation for the input types cannot be found, then the algorithm
+ searches for an implementation with a type signature to which all of the
+ inputs can be cast
+\begin_inset Quotes eld
+\end_inset
+
+safely.
+\begin_inset Quotes erd
+\end_inset
+
+ The first one it finds in its internal list of loops is selected and performed
+ with types cast.
+ Recall that internal copies during ufuncs (even for casting) are limited
+ to the size of an internal buffer which is user settable.
+
+\end_layout
+
+\begin_layout Note
+Universal functions in NumPy are flexible enough to have mixed type signatures.
+ Thus, for example, a universal function could be defined that works with
+ floating point and integer values.
+ See ldexp for an example.
+\end_layout
+
+\begin_layout Standard
+By the above description, the casting rules are essentially implemented
+ by the question of when a data type can be cast
+\begin_inset Quotes eld
+\end_inset
+
+safely
+\begin_inset Quotes erd
+\end_inset
+
+ to another data type.
+ The answer to this question can be determined in Python with a function
+ call: can_cast (fromtype, totype).
+ Figure shows the results of this call for my 32-bit system on the 21 internally
+ supported types.
+ You can generate this table for your system with code shown in that Figure.
+\end_layout
+
+\begin_layout Standard
+\begin_inset Float figure
+wide false
+sideways false
+status open
+
+\begin_layout MyCode
+>>> def print_table(ntypes):
+\newline
+...
+ print 'X',
+\newline
+...
+ for char in ntypes: print char,
+\newline
+...
+ print
+\newline
+...
+ for row in ntypes:
+\newline
+...
+ print row,
+\newline
+...
+ for col in ntypes:
+\newline
+...
+ print int(can_cast(row, col)),
+\newline
+...
+ print
+\newline
+>>> print_table(typecodes['All'])
+\newline
+X ? b h i l q p B H I L Q
+ P f d g F D G S U V O
+\newline
+? 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+\newline
+b 0
+ 1 1 1 1 1 1 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1
+\newline
+h 0 0 1 1 1 1 1 0 0 0 0 0 0
+ 1 1 1 1 1 1 1 1 1 1
+\newline
+i 0 0 0 1 1 1 1 0 0 0 0 0 0 0 1 1 0 1 1 1 1 1 1
+\newline
+l 0 0
+ 0 1 1 1 1 0 0 0 0 0 0 0 1 1 0 1 1 1 1 1 1
+\newline
+q 0 0 0 0 0 1 0 0 0 0 0 0 0 0
+ 1 1 0 1 1 1 1 1 1
+\newline
+p 0 0 0 1 1 1 1 0 0 0 0 0 0 0 1 1 0 1 1 1 1 1 1
+\newline
+B 0 0 1
+ 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+\newline
+H 0 0 0 1 1 1 1 0 1 1 1 1 1 1 1
+ 1 1 1 1 1 1 1 1
+\newline
+I 0 0 0 0 0 1 0 0 0 1 1 1 1 0 1 1 0 1 1 1 1 1 1
+\newline
+L 0 0 0 0
+ 0 1 0 0 0 1 1 1 1 0 1 1 0 1 1 1 1 1 1
+\newline
+Q 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1
+ 0 1 1 1 1 1 1
+\newline
+P 0 0 0 0 0 1 0 0 0 1 1 1 1 0 1 1 0 1 1 1 1 1 1
+\newline
+f 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1
+\newline
+d 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0
+ 1 1 1 1 1 1
+\newline
+g 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 1 1 1
+\newline
+F 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1
+\newline
+D 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
+ 1 1 1 1 1
+\newline
+G 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1
+\newline
+S 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1
+\newline
+U 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 1 1 1
+\newline
+V 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1
+\newline
+O 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1
+\end_layout
+
+\begin_layout Standard
+\begin_inset Caption
+
+\begin_layout Standard
+Code segment showing the can cast safely table for a 32-bit system.
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+You should note that, while included in the table for completeness, the
+ 'S', 'U', and 'V' types cannot be operated on by ufuncs.
+ Also, note that on a 64-bit system the integer types may have different
+ sizes resulting in a slightly altered table.
+
+\end_layout
+
+\begin_layout Standard
+Mixed scalar-array operations use a different set of casting rules that
+ ensure that a scalar cannot upcast an array unless the scalar is of a fundament
+ally different kind of data (
+\emph on
+i.e.
+
+\emph default
+ under a different hierachy in the data type hierarchy) then the array.
+ This rule enables you to use scalar constants in your code (which as Python
+ types are interpreted accordingly in ufuncs) without worrying about whether
+ the precision of the scalar constant will cause upcasting on your large
+ (small precision) array.
+
+\end_layout
+
+\begin_layout Section
+Methods
+\end_layout
+
+\begin_layout Standard
+\begin_inset LatexCommand index
+name "ufunc!methods|("
+
+\end_inset
+
+All ufuncs have 4 methods.
+ However, these methods only make sense on ufuncs that take two input arguments
+ and return one output argument.
+ Attempting to call these methods on other ufuncs will cause a
+\family typewriter
+ValueError
+\family default
+.
+ The reduce-like methods all take an axis keyword and a dtype keyword, and
+ the arrays must all have dimension >= 1.
+ The
+\emph on
+axis
+\emph default
+ keyword specifies which axis of the array the reduction will take place
+ over and may be negative, but must be an integer.
+ The
+\emph on
+dtype
+\emph default
+ keyword allows you to manage a very common problem that arises when naively
+ using <op>.reduce.
+ Sometimes you may have an array of a certain data type and wish to add
+ up all of its elements, but the result does not fit into the data type
+ of the array.
+ This commonly happens if you have an array of single-byte integers.
+ The dtype keyword allows you to alter the data type that the reduction
+ takes place over (and therefore the type of the output).
+ Thus, you can ensure that the output is a data type with large-enough precision
+ to handle your output.
+ The responsibility of altering the reduce type is mostly up to you.
+ There is one exception: if no dtype is given for a reduction on the
+\begin_inset Quotes eld
+\end_inset
+
+add
+\begin_inset Quotes erd
+\end_inset
+
+ or
+\begin_inset Quotes eld
+\end_inset
+
+multiply
+\begin_inset Quotes erd
+\end_inset
+
+ operations, then if the input type is an integer (or boolean) data-type
+ and smaller than the size of the int_ data type, it will be internally
+ upcast to the int_ (or uint) data type.
+
+\end_layout
+
+\begin_layout Warning
+A reduce-like operation on an array with a data type that has range
+\begin_inset Quotes eld
+\end_inset
+
+too small
+\begin_inset Quotes erd
+\end_inset
+
+ to handle the result will silently wrap.
+ You should use dtype to increase the data type over which reduction takes
+ place.
+\end_layout
+
+\begin_layout Subsection
+Reduce
+\end_layout
+
+\begin_layout Description
+<op>.reduce (array=, axis=0, dtype=None)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+
+\begin_inset LatexCommand index
+name "ufunc!methods!reduce"
+
+\end_inset
+
+For each one-dimensional sequence along the
+\emph on
+axis
+\emph default
+ dimension of the array, return a single number resulting from recursively
+ applying the operation to succesive elements along that dimension.
+ If the input array has
+\begin_inset Formula $N$
+\end_inset
+
+ dimensions, then the returned array has
+\begin_inset Formula $N-1$
+\end_inset
+
+ dimensions.
+ This produces the equivalent of the following Python code :
+\end_layout
+
+\begin_layout LyX-Code
+>>> indx = [index_exp[:]]*array.ndim
+\newline
+>>> indx[axis] = 0; N=array.shape[axis]
+\newline
+>>>
+ result = array[indx].astype(dtype)
+\newline
+>>> for i in range(1,N):
+\newline
+...
+ indx[axis] = i
+\newline
+...
+ <op>(result, array[indx], result)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Studying the above code can also help you gain an appreciation for how
+ to do generic indexing in Python using
+\family typewriter
+index_exp
+\family default
+.
+ For example, if <op> is add, then <op>.reduce produces a summation along
+ the given axis.
+ If <op> is prod, then a repeated multiply is performed.
+\end_layout
+
+\begin_layout Subsection
+Accumulate
+\end_layout
+
+\begin_layout Description
+<op>.accumulate (array=, axis=0, dtype=None)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+
+\begin_inset LatexCommand index
+name "ufunc!methods!accumulate"
+
+\end_inset
+
+This method is similar to reduce, except it returns an array of the same
+ shape as the input, and keeps intermediate calculations.
+ The operation is still performed along the access.
+ This method underlies the operations of the cumsum and cumprod methods
+ of arrays.
+ The following Python code implements an equivalent of the accumulate method.
+\end_layout
+
+\begin_layout LyX-Code
+>>> i1 = [index_exp[:]]*array.ndim
+\newline
+>>> i2 = [index_exp[:]]*array.ndim
+\newline
+>>> i1[axis]
+ = 0; N=array.shape[axis]
+\newline
+>>> result = array.astype(dtype)
+\newline
+>>> for i in range(1,N):
+\newline
+...
+ i1[axis] = i
+\newline
+...
+ i2[axis] = i-1
+\newline
+...
+ <op>(result[i1], array[i1], result[i2])
+\end_layout
+
+\begin_layout Subsection
+Reduceat
+\end_layout
+
+\begin_layout Description
+<op>.reduceat (array=, indices=, axis=0, dtype=None)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+
+\begin_inset LatexCommand index
+name "ufunc!methods!reduceat"
+
+\end_inset
+
+This method is a generalization of both reduce and accumulate.
+ It offers the ability to reduce along an axis but only between certain
+ indices.
+ The indices input must be a one dimensional (index) sequence.
+ Then, if
+\begin_inset Formula $I_{k}$
+\end_inset
+
+ is the
+\begin_inset Formula $k^{\textrm{th}}$
+\end_inset
+
+ element of indices, the reduceat method computes <op>.reduce(array[
+\begin_inset Formula $I_{k}$
+\end_inset
+
+:
+\begin_inset Formula $I_{k+1}$
+\end_inset
+
+]).
+ This formula assumes
+\begin_inset Formula $I_{k+1}>I_{k}$
+\end_inset
+
+, and also that
+\begin_inset Formula $I_{k+1}$
+\end_inset
+
+ is the length of the input array when
+\begin_inset Formula $I_{k}$
+\end_inset
+
+ is the last element.
+ There is no requirement that the indices be monotonic.
+ If
+\begin_inset Formula $I_{k+1}\leq I_{k},$
+\end_inset
+
+ then reduceat simply returns array[
+\begin_inset Formula $I_{k}$
+\end_inset
+
+] for that particular element of indices.
+ In these formulas, we have assumed that array is one dimensional (or axis
+ is 0).
+ If the array is
+\begin_inset Formula $N$
+\end_inset
+
+-dimensional and axis>0, then the index expression needs axis ':' (full
+ slice objects) inserted (i.e.
+ array[
+\begin_inset Formula $\underbrace{:,\ldots,:}_{\textrm{axis}},I_{k}:I_{k+1}$
+\end_inset
+
+]).
+ The effect is to slice along the axis dimension.
+ Equivalent Python code is
+\end_layout
+
+\begin_layout LyX-Code
+>>> i1 = [index_exp[:]]*array.ndim
+\newline
+>>> i2 = [index_exp[:]]*array.ndim
+\newline
+>>> outshape
+ = list(array.shape)
+\newline
+>>> N = array.shape[axis]
+\newline
+>>> outshape[axis] = len(indices)
+\newline
+>>>
+ result = zeros(outshape, dtype or array.dtype)
+\newline
+>>> for k,Ik in enumerate(indices
+):
+\newline
+...
+ i1[axis] = k
+\newline
+...
+ try:
+\newline
+...
+ Ikp1 = indices[k+1]
+\newline
+...
+ except IndexError:
+\newline
+...
+ Ikp1 = N
+\newline
+...
+ if (Ikp1 > Ik):
+\end_layout
+
+\begin_layout LyX-Code
+...
+ i2[axis] = index_exp[Ik:Ikp1]
+\newline
+...
+ result[i1] = <op>.reduce(array[i2],axis=axis,dtype=dtype)
+\newline
+...
+ else:
+\newline
+...
+ result[i1] = array[Ik].astype(dtype)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ The returned array has as many dimensions as the input array, and is the
+ same shape except for the
+\emph on
+axis
+\emph default
+ dimension which has shape equal to the length of indices (the number of
+ reduce operations that were performed).
+ If you ever have a need to compute multiple reductions over portions of
+ an array, then (if you can get your mind around what it is doing) reduceat
+ may be just what you were looking for.
+
+\end_layout
+
+\begin_deeper
+\begin_layout Description
+Example: Suppose a is a two-dimensional array of shape
+\begin_inset Formula $10\times20$
+\end_inset
+
+.
+ Then, res=add.reduce (a, [0,3,1]) returns a
+\begin_inset Formula $3\times20$
+\end_inset
+
+ array with res[0,:] = add.reduce(a[:,0:3]), res[1,:] = a[:,3], and res[2,:]
+ = add.reduce(a[:,1:]).
+
+\end_layout
+
+\end_deeper
+\begin_layout Subsection
+Outer
+\end_layout
+
+\begin_layout Description
+<op>.outer (a, b)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+
+\begin_inset LatexCommand index
+name "ufunc!methods!outer"
+
+\end_inset
+
+This method computes an outer operation on <op>.
+ It computes <op>(a2, b2) where a2 is 'a' with b.ndim 1's post-pended to
+ it's shape and b2 is 'b' with a.ndim 1's pre-pended to its shape (broadcasting
+ takes care of this automatically in the code below).
+ The return shape has a.ndim + b.ndim dimensions.
+ Equivalent Python code is
+\end_layout
+
+\begin_layout LyX-Code
+>>> a.shape += (1,)*b.ndim
+\newline
+>>> <op>(a,b)
+\newline
+>>> a = a.squeeze()
+\end_layout
+
+\begin_layout Standard
+\InsetSpace ~
+ Among many other uses, arithmetic tables can be conveniently built using
+ outer:
+\begin_inset LatexCommand index
+name "ufunc!methods|)"
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout MyCode
+>>> multiply.outer([1,7,9,12],arange(5,12))
+\newline
+array([[ 5, 6, 7, 8,
+ 9, 10, 11],
+\newline
+ [ 35, 42, 49, 56, 63, 70, 77],
+\newline
+ [ 45, 54,
+ 63, 72, 81, 90, 99],
+\newline
+ [ 60, 72, 84, 96, 108, 120, 132]])
+\end_layout
+
+\begin_layout Section
+Available ufuncs
+\end_layout
+
+\begin_layout Standard
+There are currently more than 60 universal functions defined on one or more
+ types, covering a wide variety of operations.
+ Some of these ufuncs are called automatically on arrays when the relevant
+ infix notation is used (i.e.
+ add(a,b) is called internally when a + b is written and a or b is an ndarray).
+ Nonetheless, you may still want to use the ufunc call in order to use the
+ optional output argument(s) to place the output(s) in an object (or in
+ objects) of your choice.
+
+\end_layout
+
+\begin_layout Standard
+Recall that each ufunc operates element-by-element.
+ Therefore, each ufunc will be described as if acting on a set of scalar
+ inputs to return a set of scalar outputs.
+\end_layout
+
+\begin_layout Note
+The ufunc still returns its output(s) even if you use the optional output
+ argument(s).
+
+\end_layout
+
+\begin_layout Subsection
+Math operations
+\end_layout
+
+\begin_layout Description
+add (
+\begin_inset Formula $x_{1}$
+\end_inset
+
+,
+\begin_inset Formula $x_{2}$
+\end_inset
+
+ [,
+\begin_inset Formula $y$
+\end_inset
+
+])
+\begin_inset LatexCommand index
+name "add"
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+
+\begin_inset Formula $y=x_{1}+x_{2}$
+\end_inset
+
+.
+ Called to implement
+\family typewriter
+x1+x2
+\family default
+ for arrays
+\end_layout
+
+\begin_layout Description
+subtract (
+\begin_inset Formula $x_{1}$
+\end_inset
+
+,
+\begin_inset Formula $x_{2}$
+\end_inset
+
+ [,
+\begin_inset Formula $y$
+\end_inset
+
+])
+\begin_inset LatexCommand index
+name "subtract"
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+
+\begin_inset Formula $y=x_{1}-x_{2}$
+\end_inset
+
+.
+ Called to implement
+\family typewriter
+x1-x2
+\family default
+ for arrays
+\end_layout
+
+\begin_layout Description
+multiply (
+\begin_inset Formula $x_{1}$
+\end_inset
+
+,
+\begin_inset Formula $x_{2}$
+\end_inset
+
+ [,
+\begin_inset Formula $y$
+\end_inset
+
+])
+\begin_inset LatexCommand index
+name "multiply"
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+
+\begin_inset Formula $y=x_{1}\cdot x_{2}$
+\end_inset
+
+.
+ Called to implement
+\family typewriter
+x1*x2
+\family default
+ for arrays.
+\end_layout
+
+\begin_layout Description
+divide (
+\begin_inset Formula $x_{1}$
+\end_inset
+
+,
+\begin_inset Formula $x_{2}$
+\end_inset
+
+ [,
+\begin_inset Formula $y$
+\end_inset
+
+])
+\begin_inset LatexCommand index
+name "divide"
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+
+\begin_inset Formula $y=x_{1}/x_{2}$
+\end_inset
+
+ Integer division results in truncation.
+ Floating-point does not.
+ Called to implement
+\family typewriter
+x1/x2
+\family default
+ for arrays (when __future__.division is not active).
+
+\end_layout
+
+\begin_layout Description
+true_divide (
+\begin_inset Formula $x_{1}$
+\end_inset
+
+,
+\begin_inset Formula $x_{2}$
+\end_inset
+
+ [,
+\begin_inset Formula $y$
+\end_inset
+
+])
+\begin_inset LatexCommand index
+name "true\\_divide"
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ This version of division always returns an inexact number so that integer
+ division returns floating point.
+ Called with __future__.division is active to implement
+\family typewriter
+x1/x2
+\family default
+ for arrays.
+\end_layout
+
+\begin_layout Description
+floor_divide (
+\begin_inset Formula $x_{1}$
+\end_inset
+
+,
+\begin_inset Formula $x_{2}$
+\end_inset
+
+ [,
+\begin_inset Formula $y$
+\end_inset
+
+])
+\begin_inset LatexCommand index
+name "floor\\_divide"
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ This version of division always results in truncation of an fractional
+ part remaining.
+ Called to implement
+\family typewriter
+x1//x2
+\family default
+ for arrays.
+\end_layout
+
+\begin_layout Description
+negative (
+\begin_inset Formula $x$
+\end_inset
+
+ [,
+\begin_inset Formula $y$
+\end_inset
+
+])
+\begin_inset LatexCommand index
+name "negative"
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+
+\begin_inset Formula $y=-x$
+\end_inset
+
+.
+ Called to implement
+\family typewriter
+-x
+\family default
+ for arrays.
+\end_layout
+
+\begin_layout Description
+power (
+\begin_inset Formula $x_{1}$
+\end_inset
+
+,
+\begin_inset Formula $x_{2}$
+\end_inset
+
+ [,
+\begin_inset Formula $y$
+\end_inset
+
+])
+\begin_inset LatexCommand index
+name "power"
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+
+\begin_inset Formula $y=x_{1}^{x_{2}}$
+\end_inset
+
+.
+ There is no three-term power ufunc defined.
+ This two-term power function is called to implement
+\family typewriter
+pow(x1,x2,<any>)
+\family default
+ or
+\family typewriter
+x1**x2
+\family default
+ for arrays.
+ Note that the third term in
+\family typewriter
+pow
+\family default
+ is ignored for array arguments.
+\end_layout
+
+\begin_layout Description
+remainder (
+\begin_inset Formula $x_{1}$
+\end_inset
+
+,
+\begin_inset Formula $x_{2}$
+\end_inset
+
+ [,
+\begin_inset Formula $y$
+\end_inset
+
+])
+\begin_inset LatexCommand index
+name "remainder"
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Returns
+\begin_inset Formula $x-y$
+\end_inset
+
+*floor(
+\begin_inset Formula $x/y$
+\end_inset
+
+).
+ Result has the sign of
+\begin_inset Formula $y$
+\end_inset
+
+.
+ Called to implement
+\family typewriter
+x1%x2
+\family default
+.
+\end_layout
+
+\begin_layout Description
+mod (
+\begin_inset Formula $x_{1}$
+\end_inset
+
+,
+\begin_inset Formula $x_{2}$
+\end_inset
+
+ [,
+\begin_inset Formula $y$
+\end_inset
+
+])
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Same as remainder (
+\begin_inset Formula $x_{1}$
+\end_inset
+
+,
+\begin_inset Formula $x_{2}$
+\end_inset
+
+ [,
+\begin_inset Formula $y$
+\end_inset
+
+]).
+
+\end_layout
+
+\begin_layout Description
+fmod (
+\begin_inset Formula $x_{1}$
+\end_inset
+
+,
+\begin_inset Formula $x_{2}$
+\end_inset
+
+ [,
+\begin_inset Formula $y$
+\end_inset
+
+])
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+
+\begin_inset Formula $x_{1}=kx_{2}+y$
+\end_inset
+
+ where
+\begin_inset Formula $k$
+\end_inset
+
+ is the largest integer satisfying this equation.
+ Computes C-like
+\begin_inset Formula $x_{1}\%x_{2}$
+\end_inset
+
+ element-wise.
+ This was the behavior of
+\family typewriter
+x1%x2
+\family default
+ in old Numeric.
+\end_layout
+
+\begin_layout Description
+absolute (
+\begin_inset Formula $x$
+\end_inset
+
+ [,
+\begin_inset Formula $y$
+\end_inset
+
+])
+\begin_inset LatexCommand index
+name "absolute"
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+
+\begin_inset Formula $y=\left|x\right|.$
+\end_inset
+
+ Called to implement
+\family typewriter
+abs(x)
+\family default
+ for arrays.
+
+\end_layout
+
+\begin_layout Description
+rint (x, [, y])
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Round
+\begin_inset Formula $x$
+\end_inset
+
+ to the nearest integer.
+ Rounds half-way cases to the nearest even integer.
+\end_layout
+
+\begin_layout Description
+sign (
+\begin_inset Formula $x$
+\end_inset
+
+ [,
+\begin_inset Formula $y$
+\end_inset
+
+])
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Sets
+\begin_inset Formula $y$
+\end_inset
+
+ according to
+\begin_inset Formula \[
+\textrm{sign}\left(x\right)=\left\{ \begin{array}{cc}
+1 & x:>0,\\
+0 & x=0,\\
+-1 & x<0.\end{array}\right.\]
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+conj (
+\begin_inset Formula $x$
+\end_inset
+
+ [,
+\begin_inset Formula $y$
+\end_inset
+
+])
+\begin_inset LatexCommand index
+name "conj"
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+conjugate (
+\begin_inset Formula $x$
+\end_inset
+
+ [,
+\begin_inset Formula $y$
+\end_inset
+
+])
+\begin_inset LatexCommand index
+name "conjugate"
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+
+\begin_inset Formula $y=\overline{x}$
+\end_inset
+
+; in other words, the complex conjugate of
+\begin_inset Formula $x$
+\end_inset
+
+.
+\end_layout
+
+\begin_layout Description
+exp (
+\begin_inset Formula $x$
+\end_inset
+
+ [,
+\begin_inset Formula $y$
+\end_inset
+
+])
+\begin_inset LatexCommand index
+name "exp"
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+
+\begin_inset Formula $y=e^{x}.$
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+log (
+\begin_inset Formula $x$
+\end_inset
+
+ [,
+\begin_inset Formula $y$
+\end_inset
+
+])
+\begin_inset LatexCommand index
+name "log"
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+
+\begin_inset Formula $y=\log\left(x\right)$
+\end_inset
+
+.
+ In other words,
+\begin_inset Formula $y$
+\end_inset
+
+ is the number so that
+\begin_inset Formula $e^{y}=x$
+\end_inset
+
+.
+
+\end_layout
+
+\begin_layout Description
+expm1 (
+\begin_inset Formula $x$
+\end_inset
+
+, [,
+\begin_inset Formula $y$
+\end_inset
+
+])
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+
+\begin_inset Formula $y=e^{x}-1.$
+\end_inset
+
+ Calculated so that it is accurate for small
+\begin_inset Formula $\left|x\right|.$
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+log1p (
+\begin_inset Formula $x$
+\end_inset
+
+, [,
+\begin_inset Formula $y$
+\end_inset
+
+])
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+
+\begin_inset Formula $y=\log\left(1+x\right)$
+\end_inset
+
+ but accurate for small
+\begin_inset Formula $\left|x\right|.$
+\end_inset
+
+ Returns the number
+\begin_inset Formula $y$
+\end_inset
+
+ such that
+\begin_inset Formula $e^{y}-1=x$
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+log10 (
+\begin_inset Formula $x$
+\end_inset
+
+ [,
+\begin_inset Formula $y$
+\end_inset
+
+])
+\begin_inset LatexCommand index
+name "log10"
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+
+\begin_inset Formula $y=\log10\left(x\right)$
+\end_inset
+
+.
+ In other words,
+\begin_inset Formula $y$
+\end_inset
+
+ is the number so that
+\begin_inset Formula $10^{y}=x.$
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+sqrt (
+\begin_inset Formula $x$
+\end_inset
+
+ [,
+\begin_inset Formula $y$
+\end_inset
+
+])
+\begin_inset LatexCommand index
+name "sqrt"
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+
+\begin_inset Formula $y=\sqrt{x}.$
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+square (
+\begin_inset Formula $x$
+\end_inset
+
+ [,
+\begin_inset Formula $y$
+\end_inset
+
+])
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+
+\begin_inset Formula $y=x*x$
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+reciprocal (
+\begin_inset Formula $x$
+\end_inset
+
+ [,
+\begin_inset Formula $y$
+\end_inset
+
+])
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+
+\begin_inset Formula $y=1/x$
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+ones_like (
+\begin_inset Formula $x$
+\end_inset
+
+, [,
+\begin_inset Formula $y$
+\end_inset
+
+])
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+
+\begin_inset Formula $y=1$
+\end_inset
+
+ If an output argument is not given the returned data-type is the same as
+ the input data type.
+\end_layout
+
+\begin_layout Tip
+The optional output arguments can be used to help you save memory for large
+ calculations.
+ If your arrays are large, complicated expressions can take longer than
+ absolutely necessary due to the creation and (later) destruction of temporary
+ calculation spaces.
+ For example, the expression 'G=a*b+c' is equivalent to t1=A*B; G=T1+C;
+ del t1; It will be more quickly executed as G=A*B; add(G,C,G) which is
+ the same as G=A*B; G+=C.
+\end_layout
+
+\begin_layout Subsection
+Trigonometric functions
+\end_layout
+
+\begin_layout Standard
+All trigonometric functions use radians when an angle is called for.
+ The ratio of degrees to radians is
+\begin_inset Formula $180^{\circ}/\pi.$
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+sin (
+\begin_inset Formula $x$
+\end_inset
+
+ [,
+\begin_inset Formula $y$
+\end_inset
+
+])
+\begin_inset LatexCommand index
+name "sin"
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+cos (
+\begin_inset Formula $x$
+\end_inset
+
+ [,
+\begin_inset Formula $y$
+\end_inset
+
+])
+\begin_inset LatexCommand index
+name "cos"
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+tan (
+\begin_inset Formula $x$
+\end_inset
+
+ [,
+\begin_inset Formula $y$
+\end_inset
+
+])
+\begin_inset LatexCommand index
+name "tan"
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ The standard trignometric functions.
+
+\begin_inset Formula $y=\sin\left(x\right),$
+\end_inset
+
+
+\begin_inset Formula $y=\cos\left(x\right),$
+\end_inset
+
+ and
+\begin_inset Formula $y=\tan\left(x\right).$
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+arcsin (
+\begin_inset Formula $x$
+\end_inset
+
+ [,
+\begin_inset Formula $y$
+\end_inset
+
+])
+\begin_inset LatexCommand index
+name "arcsin"
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+arccos (
+\begin_inset Formula $x$
+\end_inset
+
+ [,
+\begin_inset Formula $y$
+\end_inset
+
+])
+\begin_inset LatexCommand index
+name "arccos"
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+arctan (
+\begin_inset Formula $x$
+\end_inset
+
+ [,
+\begin_inset Formula $y$
+\end_inset
+
+])
+\begin_inset LatexCommand index
+name "arctan"
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ The inverse trigonometric functions:
+\begin_inset Formula $y=\sin^{-1}\left(x\right),$
+\end_inset
+
+
+\begin_inset Formula $y=\cos^{-1}\left(x\right)$
+\end_inset
+
+,
+\begin_inset Formula $y=\tan^{-1}\left(x\right).$
+\end_inset
+
+ These return the value of
+\begin_inset Formula $y$
+\end_inset
+
+ (in radians) such that
+\begin_inset Formula $\sin\left(y\right)=x$
+\end_inset
+
+ with
+\begin_inset Formula $y\in\left[-\frac{\pi}{2},\frac{\pi}{2}\right]$
+\end_inset
+
+;
+\begin_inset Formula $\cos\left(y\right)=x$
+\end_inset
+
+ with
+\begin_inset Formula $y\in\left[0,\pi\right]$
+\end_inset
+
+; and
+\begin_inset Formula $\tan\left(y\right)=x$
+\end_inset
+
+ with
+\begin_inset Formula $y\in\left[-\frac{\pi}{2},\frac{\pi}{2}\right]$
+\end_inset
+
+, respectively.
+
+\end_layout
+
+\begin_layout Description
+arctan2 (
+\begin_inset Formula $x_{1}$
+\end_inset
+
+,
+\begin_inset Formula $x_{2}$
+\end_inset
+
+ [,
+\begin_inset Formula $y$
+\end_inset
+
+])
+\begin_inset LatexCommand index
+name "arctan2"
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Returns
+\begin_inset Formula $\tan^{-1}\left(\frac{x_{1}}{x_{2}}\right)$
+\end_inset
+
+ but takes into account the sign on
+\begin_inset Formula $x_{1}$
+\end_inset
+
+ and
+\begin_inset Formula $x_{2}$
+\end_inset
+
+ to place the angle in the correct quadrant.
+ The angle
+\begin_inset Formula $y$
+\end_inset
+
+ is returned in the full range
+\begin_inset Formula $-\pi<y\leq\pi$
+\end_inset
+
+.
+ The angle is chosen so that
+\begin_inset Formula $\sin\left(y\right)=\frac{x_{1}}{\sqrt{x_{1}^{2}+x_{2}^{2}}},$
+\end_inset
+
+ and
+\begin_inset Formula $\cos\left(y\right)=\frac{x_{2}}{\sqrt{x_{1}^{2}+x_{2}^{2}}}.$
+\end_inset
+
+ Particular values are showin in the following table:
+\end_layout
+
+\begin_layout Standard
+\align center
+\begin_inset Tabular
+<lyxtabular version="3" rows="5" columns="3">
+<features>
+<column alignment="center" valignment="top" leftline="true" width="0">
+<column alignment="center" valignment="top" leftline="true" width="0">
+<column alignment="center" valignment="top" leftline="true" rightline="true" width="0">
+<row topline="true" bottomline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+\begin_inset Formula $x_{1}$
+\end_inset
+
+
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+\begin_inset Formula $x_{2}$
+\end_inset
+
+
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+\begin_inset Formula $y=\textrm{arctan2}\left(x_{1},x_{2}\right)$
+\end_inset
+
+
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+0
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+1
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+0
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+1
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+0
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+\begin_inset Formula $\frac{\pi}{2}$
+\end_inset
+
+
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+0
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+-1
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+\begin_inset Formula $\pi$
+\end_inset
+
+
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true" bottomline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+-1
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+0
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+\begin_inset Formula $-\frac{\pi}{2}$
+\end_inset
+
+
+\end_layout
+
+\end_inset
+</cell>
+</row>
+</lyxtabular>
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+hypot (
+\begin_inset Formula $x_{1}$
+\end_inset
+
+,
+\begin_inset Formula $x_{2}$
+\end_inset
+
+ [,
+\begin_inset Formula $y$
+\end_inset
+
+])
+\begin_inset LatexCommand index
+name "hypot"
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Returns
+\begin_inset Formula $y=\sqrt{x_{1}^{2}+x_{2}^{2}}.$
+\end_inset
+
+ Given a complex number in cartesian form, arctan2 and hypot can be used
+ to compute phase and magnitude, quickly.
+\end_layout
+
+\begin_layout Description
+sinh (
+\begin_inset Formula $x$
+\end_inset
+
+ [,
+\begin_inset Formula $y$
+\end_inset
+
+])
+\begin_inset LatexCommand index
+name "sinh"
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Computes
+\begin_inset Formula $y=\sinh\left(x\right)$
+\end_inset
+
+ which is defined as
+\begin_inset Formula $\frac{1}{2}\left(e^{x}-e^{-x}\right).$
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+cosh (
+\begin_inset Formula $x$
+\end_inset
+
+ [,
+\begin_inset Formula $y$
+\end_inset
+
+])
+\begin_inset LatexCommand index
+name "cosh"
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Computes
+\begin_inset Formula $y=\cosh\left(x\right)$
+\end_inset
+
+ which is defined as
+\begin_inset Formula $\frac{1}{2}\left(e^{x}+e^{-x}\right).$
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+tanh (
+\begin_inset Formula $x$
+\end_inset
+
+ [,
+\begin_inset Formula $y$
+\end_inset
+
+])
+\begin_inset LatexCommand index
+name "tanh"
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Computes
+\begin_inset Formula $y=\tanh\left(x\right)$
+\end_inset
+
+ which is defined as
+\begin_inset Formula $\left(e^{x}-e^{-x}\right)/\left(e^{x}+e^{-x}\right).$
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+arcsinh (
+\begin_inset Formula $x$
+\end_inset
+
+ [,
+\begin_inset Formula $y$
+\end_inset
+
+])
+\begin_inset LatexCommand index
+name "arcsinh"
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+arccosh (
+\begin_inset Formula $x$
+\end_inset
+
+ [,
+\begin_inset Formula $y$
+\end_inset
+
+])
+\begin_inset LatexCommand index
+name "arccosh"
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+arctanh (
+\begin_inset Formula $x$
+\end_inset
+
+ [,
+\begin_inset Formula $y$
+\end_inset
+
+])
+\begin_inset LatexCommand index
+name "arctanh"
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ These compute the inverse hyperpolic functions.
+
+\begin_inset Formula $y=\textrm{arc}func\left(x\right)$
+\end_inset
+
+ is the (principal) value of
+\begin_inset Formula $y$
+\end_inset
+
+ such that
+\begin_inset Formula $func\left(y\right)=x.$
+\end_inset
+
+
+\end_layout
+
+\begin_layout Subsection
+Bit-twiddling functions
+\end_layout
+
+\begin_layout Standard
+These function all need integer arguments and they maniuplate the bit-pattern
+ of those arguments.
+\end_layout
+
+\begin_layout Description
+bitwise_and (
+\begin_inset Formula $x_{1}$
+\end_inset
+
+,
+\begin_inset Formula $x_{2}$
+\end_inset
+
+ [,
+\begin_inset Formula $y$
+\end_inset
+
+])
+\begin_inset LatexCommand index
+name "bitwise\\_and"
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Each bit in
+\begin_inset Formula $y$
+\end_inset
+
+ is the result of a bit-wise 'and' operation on the corresponding bits in
+
+\begin_inset Formula $x_{1}$
+\end_inset
+
+ and
+\begin_inset Formula $x_{2}$
+\end_inset
+
+.
+ Called to implement
+\family typewriter
+x1&x2
+\family default
+ for arrays.
+
+\end_layout
+
+\begin_layout Description
+bitwise_or (
+\begin_inset Formula $x_{1}$
+\end_inset
+
+,
+\begin_inset Formula $x_{2}$
+\end_inset
+
+ [,
+\begin_inset Formula $y$
+\end_inset
+
+])
+\begin_inset LatexCommand index
+name "bitwise\\_or"
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Each bit in
+\begin_inset Formula $y$
+\end_inset
+
+ is the result of a bit-wise 'or' operation on the corresponding bits in
+
+\begin_inset Formula $x_{1}$
+\end_inset
+
+ and
+\begin_inset Formula $x_{2}$
+\end_inset
+
+.
+ Called to implement
+\family typewriter
+x1|x2
+\family default
+ for arrays.
+\end_layout
+
+\begin_layout Description
+bitwise_xor (
+\begin_inset Formula $x_{1}$
+\end_inset
+
+,
+\begin_inset Formula $x_{2}$
+\end_inset
+
+ [,
+\begin_inset Formula $y$
+\end_inset
+
+])
+\begin_inset LatexCommand index
+name "bitwise\\_xor"
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Each bit in
+\begin_inset Formula $y$
+\end_inset
+
+ is the result of a bit-wise 'xor' operation on the corresponding bits in
+
+\begin_inset Formula $x_{1}$
+\end_inset
+
+ and
+\begin_inset Formula $x_{2}$
+\end_inset
+
+.
+ An xor operation sets the output to 1 if one and only one of the input
+ bits is 1.
+ Called to implement
+\family typewriter
+x1^x2
+\family default
+ for arrays.
+ Using the bitwise_xor operation and the optional output argument you can
+ swap the values of two integer arrays of equivalent types without using
+ temporary arrays.
+\end_layout
+
+\begin_layout MyCode
+>>> a=arange(10)
+\newline
+>>> b=arange(10,20)
+\newline
+>>> bitwise_xor(a,b,a); bitwise_xor(a,b,b);
+\newline
+>>
+> bitwise_xor(a,b,a)
+\newline
+array([10, 11, 12, 13, 14, 15, 16, 17, 18, 19])
+\newline
+>>> print
+ a; print b
+\newline
+[10 11 12 13 14 15 16 17 18 19]
+\newline
+[0 1 2 3 4 5 6 7 8 9]
+\end_layout
+
+\begin_layout Description
+invert (
+\begin_inset Formula $x$
+\end_inset
+
+, [,
+\begin_inset Formula $y$
+\end_inset
+
+])
+\begin_inset LatexCommand index
+name "invert"
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Each bit in
+\begin_inset Formula $y$
+\end_inset
+
+ is the opposite of the corresponding bit in
+\begin_inset Formula $x$
+\end_inset
+
+.
+ Called to implement
+\family typewriter
+~x
+\family default
+ for arrays.
+\end_layout
+
+\begin_layout Description
+left_shift (
+\begin_inset Formula $x_{1}$
+\end_inset
+
+,
+\begin_inset Formula $x_{2}$
+\end_inset
+
+ [,
+\begin_inset Formula $y$
+\end_inset
+
+])
+\begin_inset LatexCommand index
+name "left\\_shift"
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Shifts the bits of
+\begin_inset Formula $x_{1}$
+\end_inset
+
+ to the left by
+\begin_inset Formula $x_{2}$
+\end_inset
+
+.
+ Called to implement
+\family typewriter
+x1<<x2
+\family default
+ for arrays.
+ Provided there is no overflow, the result is equal to
+\begin_inset Formula $y=x_{1}2^{x_{2}}.$
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+right_shift (
+\begin_inset Formula $x_{1}$
+\end_inset
+
+,
+\begin_inset Formula $x_{2}$
+\end_inset
+
+ [,
+\begin_inset Formula $y$
+\end_inset
+
+])
+\begin_inset LatexCommand index
+name "right\\_shift"
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Shifts the bits of
+\begin_inset Formula $x_{1}$
+\end_inset
+
+ to the right by
+\begin_inset Formula $x_{2}$
+\end_inset
+
+.
+ Called to implement
+\family typewriter
+x1>>x2
+\family default
+ for arrays.
+ Absent overflow, the result is equal to
+\begin_inset Formula $y=x_{1}2^{-x_{2}}$
+\end_inset
+
+.
+\end_layout
+
+\begin_layout Subsection
+Comparison functions
+\end_layout
+
+\begin_layout Standard
+All of these functions (except maximum, minimum, and sign) return Boolean
+ arrays.
+
+\end_layout
+
+\begin_layout Description
+greater (
+\begin_inset Formula $x_{1}$
+\end_inset
+
+,
+\begin_inset Formula $x_{2}$
+\end_inset
+
+ [,
+\begin_inset Formula $y$
+\end_inset
+
+])
+\begin_inset LatexCommand index
+name "greater"
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+greater_equal (
+\begin_inset Formula $x_{1}$
+\end_inset
+
+,
+\begin_inset Formula $x_{2}$
+\end_inset
+
+ [,
+\begin_inset Formula $y$
+\end_inset
+
+])
+\begin_inset LatexCommand index
+name "greater\\_equal"
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+less (
+\begin_inset Formula $x_{1}$
+\end_inset
+
+,
+\begin_inset Formula $x_{2}$
+\end_inset
+
+ [,
+\begin_inset Formula $y$
+\end_inset
+
+])
+\begin_inset LatexCommand index
+name "less"
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+less_equal (
+\begin_inset Formula $x_{1}$
+\end_inset
+
+,
+\begin_inset Formula $x_{2}$
+\end_inset
+
+ [,
+\begin_inset Formula $y$
+\end_inset
+
+])
+\begin_inset LatexCommand index
+name "less\\_equal"
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+not_equal (
+\begin_inset Formula $x_{1}$
+\end_inset
+
+,
+\begin_inset Formula $x_{2}$
+\end_inset
+
+ [,
+\begin_inset Formula $y$
+\end_inset
+
+])
+\begin_inset LatexCommand index
+name "not\\_equal"
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+equal (
+\begin_inset Formula $x_{1}$
+\end_inset
+
+,
+\begin_inset Formula $x_{2}$
+\end_inset
+
+ [,
+\begin_inset Formula $y$
+\end_inset
+
+])
+\begin_inset LatexCommand index
+name "equal"
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ These functions are called to implement
+\family typewriter
+x1>x2
+\family default
+,
+\family typewriter
+x1>=x2
+\family default
+,
+\family typewriter
+x1<x2
+\family default
+,
+\family typewriter
+x1<=x2
+\family default
+,
+\family typewriter
+x1!=x2
+\family default
+ (or
+\family typewriter
+x1<>x2
+\family default
+), and
+\family typewriter
+x1==x2
+\family default
+, respectively, for arrays.
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ The fact that these functions return Boolean arrays make them very useful
+ in combination with advanced array indexing.
+ Thus, for example, arr[arr>10] = 10 clips large values to 10.
+ Used in conjunction with bitwise operators quite complicated expressions
+ are possible.
+ For example, arr[~((arr<10)&(arr>5))] = 0 clips all values outside of the
+ range
+\begin_inset Formula $\left(5,10\right)$
+\end_inset
+
+ to 0.
+
+\end_layout
+
+\begin_layout Warning
+Do not use the Python keywords
+\family typewriter
+and
+\family default
+ and
+\family typewriter
+or
+\family default
+ to combine logical array expressions.
+ These keywords will test the truth value of the entire array (not element-by-el
+ement as you might expect).
+ Use the bitwise operators: & and | instead.
+\end_layout
+
+\begin_layout Description
+logical_and (
+\begin_inset Formula $x_{1}$
+\end_inset
+
+,
+\begin_inset Formula $x_{2}$
+\end_inset
+
+ [,
+\begin_inset Formula $y$
+\end_inset
+
+])
+\begin_inset LatexCommand index
+name "logical\\_and"
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ The output is the truth value of
+\begin_inset Formula $x_{1}$
+\end_inset
+
+
+\series bold
+and
+\series default
+
+\begin_inset Formula $x_{2}$
+\end_inset
+
+.
+ Numbers equal to 0 are considered False.
+ Nonzero numbers are True.
+\end_layout
+
+\begin_layout Description
+logical_or (
+\begin_inset Formula $x_{1}$
+\end_inset
+
+,
+\begin_inset Formula $x_{2}$
+\end_inset
+
+ [,
+\begin_inset Formula $y$
+\end_inset
+
+])
+\begin_inset LatexCommand index
+name "logical\\_or"
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ The output,
+\begin_inset Formula $y$
+\end_inset
+
+, is the truth value of
+\begin_inset Formula $x_{1}$
+\end_inset
+
+
+\series bold
+or
+\begin_inset Formula $x_{2}$
+\end_inset
+
+
+\series default
+ .
+\end_layout
+
+\begin_layout Description
+logical_xor (
+\begin_inset Formula $x_{1}$
+\end_inset
+
+,
+\begin_inset Formula $x_{2}$
+\end_inset
+
+ [,
+\begin_inset Formula $y$
+\end_inset
+
+])
+\begin_inset LatexCommand index
+name "logical\\_xor"
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ The output,
+\begin_inset Formula $y$
+\end_inset
+
+, is the truth value of
+\begin_inset Formula $x_{1}$
+\end_inset
+
+
+\series bold
+xor
+\begin_inset Formula $x_{2}$
+\end_inset
+
+
+\series default
+, which is the same as (
+\begin_inset Formula $x_{1}$
+\end_inset
+
+ and not
+\begin_inset Formula $x_{2}$
+\end_inset
+
+) or (not
+\begin_inset Formula $x_{1}$
+\end_inset
+
+ and
+\begin_inset Formula $x_{2}$
+\end_inset
+
+).
+\end_layout
+
+\begin_layout Description
+logical_not (
+\begin_inset Formula $x$
+\end_inset
+
+ [,
+\begin_inset Formula $y$
+\end_inset
+
+])
+\begin_inset LatexCommand index
+name "logical\\_not"
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ The output,
+\begin_inset Formula $y$
+\end_inset
+
+ is the truth value of
+\series bold
+not
+\series default
+
+\begin_inset Formula $x$
+\end_inset
+
+.
+
+\end_layout
+
+\begin_layout Warning
+The Bitwise operators (& and |) are the proper way to combine element-by-element
+ array comparisons.
+ Be sure to understand the operator precedence: (a>2) & (a<5) is the proper
+ syntax because a>2 & a<5 will result in an error due to the fact that 2
+ & a is evaluated first.
+\end_layout
+
+\begin_layout Description
+maximum (
+\begin_inset Formula $x_{1}$
+\end_inset
+
+,
+\begin_inset Formula $x_{2}$
+\end_inset
+
+ [,
+\begin_inset Formula $y$
+\end_inset
+
+])
+\begin_inset LatexCommand index
+name "maximum"
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ The output,
+\begin_inset Formula $y$
+\end_inset
+
+, is the larger of
+\begin_inset Formula $x_{1}$
+\end_inset
+
+ and
+\begin_inset Formula $x_{2}$
+\end_inset
+
+.
+
+\end_layout
+
+\begin_layout MyCode
+>>> maximum([1,0,5,10],[3,2,4,5])
+\newline
+array([ 3, 2, 5, 10])
+\newline
+>>> max([1,0,5,10],[3,2,
+4,5])
+\newline
+[3, 2, 4, 5]
+\end_layout
+
+\begin_layout Tip
+The Python function max() will find the maximum over a one-dimensional array,
+ but it will do so using a slower sequence interface.
+ The reduce method of the maximum ufunc is much faster.
+ Also, the max() method will not give answers you might expect for arrays
+ with greater than one dimension.
+ The reduce method of minimum also allows you to compute a total minimum
+ over an array.
+\end_layout
+
+\begin_layout Description
+minimum (
+\begin_inset Formula $x_{1}$
+\end_inset
+
+,
+\begin_inset Formula $x_{2}$
+\end_inset
+
+ [,
+\begin_inset Formula $y$
+\end_inset
+
+])
+\begin_inset LatexCommand index
+name "minimum"
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ The output,
+\begin_inset Formula $y$
+\end_inset
+
+, is the smaller of
+\begin_inset Formula $x_{1}$
+\end_inset
+
+ and
+\begin_inset Formula $x_{2}$
+\end_inset
+
+.
+\end_layout
+
+\begin_layout MyCode
+>>> minimum([1,0,5,10],[3,2,4,5])
+\newline
+array([1, 0, 4, 5])
+\newline
+>>> min([1,0,5,10],[3,2,4,5]
+)
+\newline
+[1, 0, 5, 10]
+\end_layout
+
+\begin_layout Warning
+the behavior of maximum(a,b) is than that of max(a,b).
+ As a ufunc, maximum(a,b) performs an element-by-element comparison of a
+ and b and chooses each element of the result according to which element
+ in the two arrays is larger.
+ In contrast, max(a,b) treats the objects a and b as a whole, looks at the
+ (total) truth value of a>b and uses it to return either a or b (as a whole).
+ A similar difference exists between minimum(a,b) and min(a,b).
+
+\end_layout
+
+\begin_layout Subsection
+Floating functions
+\end_layout
+
+\begin_layout Standard
+Recall that all of these functions work element-by-element over an array,
+ returning an array output.
+ The description details only a single operation.
+\end_layout
+
+\begin_layout Description
+isreal (
+\begin_inset Formula $x$
+\end_inset
+
+)
+\begin_inset LatexCommand index
+name "isreal"
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ True if
+\begin_inset Formula $x$
+\end_inset
+
+ has an imaginary part that is 0.
+\end_layout
+
+\begin_layout Description
+iscomplex (
+\begin_inset Formula $x$
+\end_inset
+
+)
+\begin_inset LatexCommand index
+name "iscomplex"
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ True if
+\begin_inset Formula $x$
+\end_inset
+
+ has an imaginary part that is non-zero.
+
+\end_layout
+
+\begin_layout Description
+isfinite (
+\begin_inset Formula $x$
+\end_inset
+
+)
+\begin_inset LatexCommand index
+name "isfinite"
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ True if
+\begin_inset Formula $x$
+\end_inset
+
+ is a finite floating point number (not a NaN or an Inf).
+
+\end_layout
+
+\begin_layout Description
+isinf (
+\begin_inset Formula $x$
+\end_inset
+
+)
+\begin_inset LatexCommand index
+name "isinf"
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ True if
+\begin_inset Formula $x$
+\end_inset
+
+ is
+\begin_inset Formula $\pm\infty$
+\end_inset
+
+.
+
+\end_layout
+
+\begin_layout Description
+isnan (
+\begin_inset Formula $x$
+\end_inset
+
+)
+\begin_inset LatexCommand index
+name "isnan"
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ True if
+\begin_inset Formula $x$
+\end_inset
+
+ is Not-a-Number.
+ This represents invalid results.
+ When a NaN is created, the invalid flag is set.
+ If you set the error mode of invalid to 'warn', 'raise', or 'call', then
+ the appropriate action will be performed on NaN creation.
+
+\end_layout
+
+\begin_layout Description
+signbit (
+\begin_inset Formula $x$
+\end_inset
+
+)
+\begin_inset LatexCommand index
+name "signbit"
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ True where the sign bit of the floating point number is set.
+ This should correspond to
+\begin_inset Formula $x>0$
+\end_inset
+
+ when
+\begin_inset Formula $x$
+\end_inset
+
+ is a finite number.
+ When,
+\begin_inset Formula $x$
+\end_inset
+
+ is NaN or infinite, then this tests the actual signbit.
+
+\end_layout
+
+\begin_layout Description
+modf (
+\begin_inset Formula $x$
+\end_inset
+
+ [,
+\begin_inset Formula $y_{1}$
+\end_inset
+
+,
+\begin_inset Formula $y_{2}$
+\end_inset
+
+])
+\begin_inset LatexCommand index
+name "modf"
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Breaks up the floating point value
+\begin_inset Formula $x$
+\end_inset
+
+ into its fractional,
+\begin_inset Formula $y_{1}$
+\end_inset
+
+, and integral,
+\begin_inset Formula $y_{2}$
+\end_inset
+
+, parts.
+ Thus,
+\begin_inset Formula $x=y_{1}+y_{2}$
+\end_inset
+
+ with
+\family typewriter
+floor(y2)==y2
+\family default
+.
+
+\end_layout
+
+\begin_layout Description
+ldexp (
+\begin_inset Formula $x$
+\end_inset
+
+,
+\begin_inset Formula $n$
+\end_inset
+
+ [,
+\begin_inset Formula $y$
+\end_inset
+
+])
+\begin_inset LatexCommand index
+name "ldexp"
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Fast multiply of a floating point number by an integral power of 2:
+\begin_inset Formula $y=2^{n}x.$
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+frexp (
+\begin_inset Formula $x$
+\end_inset
+
+ [,
+\begin_inset Formula $y$
+\end_inset
+
+,
+\begin_inset Formula $n$
+\end_inset
+
+])
+\begin_inset LatexCommand index
+name "frexp"
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Breaks up the floating point value
+\begin_inset Formula $x$
+\end_inset
+
+ into a normalized fraction,
+\begin_inset Formula $y$
+\end_inset
+
+ and an exponent,
+\begin_inset Formula $n$
+\end_inset
+
+ which corresponds to how the value is represented in the computer.
+ The results are such that
+\begin_inset Formula $x=y2^{n}.$
+\end_inset
+
+ Effectively, the inverse of ldexp.
+
+\end_layout
+
+\begin_layout Description
+fmod (
+\begin_inset Formula $x_{1}$
+\end_inset
+
+,
+\begin_inset Formula $x_{2}$
+\end_inset
+
+ [,
+\begin_inset Formula $y$
+\end_inset
+
+])
+\begin_inset LatexCommand index
+name "fmod"
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Computes the remainder of dividing
+\begin_inset Formula $x_{1}$
+\end_inset
+
+ by
+\begin_inset Formula $x_{2}$
+\end_inset
+
+.
+ The result,
+\begin_inset Formula $y$
+\end_inset
+
+, is
+\begin_inset Formula $x_{1}-nx_{2}$
+\end_inset
+
+ where
+\begin_inset Formula $n$
+\end_inset
+
+ is the quotient (rounded towards zero to an integer) of
+\begin_inset Formula $x_{1}/x_{2}.$
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+floor (
+\begin_inset Formula $x$
+\end_inset
+
+ [,
+\begin_inset Formula $y$
+\end_inset
+
+ ])
+\begin_inset LatexCommand index
+name "floor"
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Return
+\begin_inset Formula $y=\left\lfloor x\right\rfloor $
+\end_inset
+
+ where
+\begin_inset Formula $y$
+\end_inset
+
+ is the nearest integer smaller-than or equal to
+\begin_inset Formula $x.$
+\end_inset
+
+ Thus,
+\begin_inset Formula $ $
+\end_inset
+
+
+\begin_inset Formula $\left\lfloor x\right\rfloor \leq x<\left\lfloor x\right\rfloor +1$
+\end_inset
+
+.
+
+\end_layout
+
+\begin_layout Description
+ceil (
+\begin_inset Formula $x$
+\end_inset
+
+ [,
+\begin_inset Formula $y$
+\end_inset
+
+ ])
+\begin_inset LatexCommand index
+name "ceil"
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Return
+\begin_inset Formula $y=\left\lceil x\right\rceil $
+\end_inset
+
+ where
+\begin_inset Formula $y$
+\end_inset
+
+ is the nearest integer greater-than or equal to
+\begin_inset Formula $x$
+\end_inset
+
+.
+ Thus,
+\begin_inset Formula $x\leq\left\lceil x\right\rceil <x+1.$
+\end_inset
+
+
+\begin_inset LatexCommand index
+name "ufunc|)"
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Chapter
+Basic Modules
+\end_layout
+
+\begin_layout Quotation
+It is the mark of an educated mind to rest satisfied with the degree of
+ precision which the nature of the subject admits and not to seek exactness
+ where only an approximation is possible.
+\end_layout
+
+\begin_layout Right Address
+---
+\emph on
+Aristotle
+\end_layout
+
+\begin_layout Quotation
+"Oh no.
+ We're in the hands of engineers!"
+\end_layout
+
+\begin_layout Right Address
+---
+\emph on
+Malcolm, Ian in 'Jurassic Park'
+\end_layout
+
+\begin_layout Standard
+The NumPy distribution contains some basic functionality equivalent to what
+ was available in the Numeric packages previously.
+ This section documents the new interfaces.
+ These are sub-packages of the NumPy namespace.
+ The linalg and fft capabilities are useful but limited.
+ You should install the full SciPy package to access more functionality.
+ The numpy.dual module contains functions that are defined in both SciPy
+ and NumPy.
+ If SciPy defines func, then numpy.dual.func will point to the SciPy version,
+ otherwise it will point to the NumPy version.
+ It must be imported specifically to be used.
+ Table
+\begin_inset LatexCommand ref
+reference "cap:Functions-in-numpy.dual"
+
+\end_inset
+
+ shows the functions defined in numpy.dual that are in both NumPy and SciPy.
+\end_layout
+
+\begin_layout Standard
+\begin_inset Float table
+wide false
+sideways false
+status open
+
+\begin_layout Standard
+\begin_inset Caption
+
+\begin_layout Standard
+\begin_inset LatexCommand label
+name "cap:Functions-in-numpy.dual"
+
+\end_inset
+
+Functions in numpy.dual (both in NumPy and SciPy)
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+\align center
+\begin_inset Tabular
+<lyxtabular version="3" rows="4" columns="2">
+<features>
+<column alignment="center" valignment="top" leftline="true" width="0">
+<column alignment="center" valignment="middle" leftline="true" rightline="true" width="55text%">
+<row topline="true" bottomline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+Family
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+Functions
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+Fourier Transforms
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+fft, ifft, fft2, ifft2, fftn, ifftn
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+Linear Algebra
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+norm, det, inv, pinv, solve, eig, eigh, eigvals, eigvalsh, lstsq, cholesky,
+ svd
+\end_layout
+
+\end_inset
+</cell>
+</row>
+<row topline="true" bottomline="true">
+<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+Special Functions
+\end_layout
+
+\end_inset
+</cell>
+<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none">
+\begin_inset Text
+
+\begin_layout Standard
+i0
+\end_layout
+
+\end_inset
+</cell>
+</row>
+</lyxtabular>
+
+\end_inset
+
+
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Section
+Linear Algebra (
+\family typewriter
+linalg
+\family default
+)
+\end_layout
+
+\begin_layout Standard
+\begin_inset LatexCommand index
+name "linalg|("
+
+\end_inset
+
+These functions are in the numpy.linalg sub-package.
+\end_layout
+
+\begin_layout Description
+inv (A)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Return the (matrix) inverse of the 2-d array A.
+ The result, X, is such that dot(A,X) is equal to eye(*A.shape) (to within
+ machine precision).
+
+\end_layout
+
+\begin_layout Description
+solve (A,b)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Find the solution to the linear equation
+\begin_inset Formula $\mathbf{Ax}=\mathbf{b}$
+\end_inset
+
+, where
+\begin_inset Formula $A$
+\end_inset
+
+ is a 2-d array and
+\begin_inset Formula $b$
+\end_inset
+
+ is a 1-d or 2-d array.
+
+\end_layout
+
+\begin_layout Description
+tensorsolve (A, b, axes=None)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Find the solution,
+\begin_inset Formula $x_{kl}$
+\end_inset
+
+, to the multi-index linear equation
+\begin_inset Formula \[
+\sum_{kl}A_{ijkl}x_{kl}=b_{ij}.\]
+
+\end_inset
+
+ The axes argument specifies which dimensions of
+\begin_inset Formula $A$
+\end_inset
+
+ are summed over.
+ If it is None, then the last A.ndim - b.ndim dimensions are summed over.
+ The result, therefore, has dimension x.ndim = A.ndim-b.ndim.
+
+\end_layout
+
+\begin_layout Description
+tensorinv (A, ind=2)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Find the tensor inverse of
+\begin_inset Formula $A$
+\end_inset
+
+, defined to be the tensor such that tensordot (Ainv, A) is an identity
+ operator.
+
+\end_layout
+
+\begin_layout Description
+cholesky (A)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Return,
+\begin_inset Formula $\mathbf{L}$
+\end_inset
+
+, the Cholesky decomposition of
+\begin_inset Formula $\mathbf{A}$
+\end_inset
+
+.
+ Cholesky decomposition is applicable to a Hermitian, positive definite
+ matrices.
+ When
+\begin_inset Formula $\mathbf{A}=\mathbf{A}^{H}$
+\end_inset
+
+ and
+\begin_inset Formula $\mathbf{x}^{H}\mathbf{Ax}\geq0$
+\end_inset
+
+ for all
+\begin_inset Formula $\mathbf{x}$
+\end_inset
+
+, then decompositions of
+\begin_inset Formula $\mathbf{A}$
+\end_inset
+
+ can be found so that
+\begin_inset Formula $\mathbf{A}=\mathbf{LL}^{H}$
+\end_inset
+
+, where
+\begin_inset Formula $\mathbf{L}$
+\end_inset
+
+ is lower-triangular.
+
+\end_layout
+
+\begin_layout Description
+eigvals (A)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Return all solutions (
+\begin_inset Formula $\lambda$
+\end_inset
+
+) to the equation
+\begin_inset Formula $\mathbf{Ax}=\lambda\mathbf{x}$
+\end_inset
+
+.
+\end_layout
+
+\begin_layout Description
+eig (A)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Return all solutions
+\begin_inset Formula $\left(\lambda,\mathbf{x}\right)$
+\end_inset
+
+ to the equation
+\begin_inset Formula $\mathbf{Ax}=\lambda\mathbf{x}$
+\end_inset
+
+.
+ The first element of the return tuple contains all the eigenvalues.
+ The second element of the return tuple contains the eigenvectors in the
+ columns (x[:,i] is the ith eigenvector).
+\end_layout
+
+\begin_layout Description
+eigvalsh (U)
+\end_layout
+
+\begin_layout Description
+eigh (U)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ These functions are identical to eigvals and eig except they only work
+ with Hermitian matrices where
+\begin_inset Formula $\mathbf{U}^{H}=\mathbf{U}$
+\end_inset
+
+ (only the lower-triangular part of the array is used).
+\end_layout
+
+\begin_layout Description
+svd (A)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Compute the singular value decomposition of the 2-d array
+\begin_inset Formula $\mathbf{A}$
+\end_inset
+
+.
+ Every
+\begin_inset Formula $m\times n$
+\end_inset
+
+ matrix can be decomposed into a pair of unitary matrices,
+\begin_inset Formula $\mathbf{U}=\mathbf{U}^{H}$
+\end_inset
+
+ (
+\begin_inset Formula $m\times m$
+\end_inset
+
+) and
+\begin_inset Formula $\mathbf{V}=\mathbf{V}^{H}$
+\end_inset
+
+ (
+\begin_inset Formula $n\times n$
+\end_inset
+
+) and an
+\begin_inset Formula $m\times n$
+\end_inset
+
+
+\begin_inset Quotes eld
+\end_inset
+
+diagonal
+\begin_inset Quotes erd
+\end_inset
+
+ matrix
+\begin_inset Formula $\boldsymbol{\Sigma}$
+\end_inset
+
+, such that
+\begin_inset Formula $\mathbf{A}=\mathbf{U\boldsymbol{\Sigma}}\mathbf{V}^{H}$
+\end_inset
+
+.
+ The only non-zero portion of
+\begin_inset Formula $\boldsymbol{\Sigma}$
+\end_inset
+
+ is the upper
+\begin_inset Formula $r\times r$
+\end_inset
+
+ block where
+\begin_inset Formula $r=\min\left(m,n\right)$
+\end_inset
+
+.
+ The svd function returns three arrays as a tuple: (
+\begin_inset Formula $\mathbf{U}$
+\end_inset
+
+,
+\begin_inset Formula $\boldsymbol{\sigma}$
+\end_inset
+
+,
+\begin_inset Formula $\mathbf{V}^{H}$
+\end_inset
+
+).
+ The singular values are returned in the 1-d array
+\begin_inset Formula $\boldsymbol{\sigma}$
+\end_inset
+
+.
+ If needed, the array
+\begin_inset Formula $\boldsymbol{\Sigma}$
+\end_inset
+
+ can be found (if really needed) using the command diag(
+\begin_inset Formula $\boldsymbol{\sigma}$
+\end_inset
+
+) which creates the
+\begin_inset Formula $r\times r$
+\end_inset
+
+ diagonal block and then inserting this into a zeros matrix:
+\end_layout
+
+\begin_layout MyCode
+>>> A = random.rand(3,5)
+\newline
+>>> from numpy.dual import svd; U,s,Vh = svd(A)
+\newline
+>>>
+ r=min(*A.shape); Sig = zeros_like(A);
+\newline
+>>> Sig[:r,:r] = diag(s); print Sig
+\newline
+[[
+ 2.1634 0.
+ 0.
+ 0.
+ 0.
+ ]
+\newline
+ [ 0.
+ 0.7076 0.
+ 0.
+ 0.
+ ]
+\newline
+ [ 0.
+ 0.
+ 0.2098 0.
+ 0.
+ ]]
+\end_layout
+
+\begin_layout Description
+pinv (A, rcond=
+\begin_inset Formula $10^{-10}$
+\end_inset
+
+)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Return the generalized, pseudo inverse, of
+\begin_inset Formula $A$
+\end_inset
+
+.
+ For invertible matrices, this is the same as the inverse.
+
+\end_layout
+
+\begin_layout Description
+det (A)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Return the determinant of the array.
+ The determinant of an array is the product of its singular values.
+
+\end_layout
+
+\begin_layout Description
+lstsq (A, b, rcond=
+\begin_inset Formula $10^{-10}$
+\end_inset
+
+)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Return (x, resids, rank, s) where x minimizes resids=
+\begin_inset Formula $\left\Vert \mathbf{Ax}-\mathbf{b}\right\Vert _{2}$
+\end_inset
+
+.
+ The output rank is the rank of A and s is the singular values of a in descendin
+g order.
+ Singular values less than s[0]*rcond are treated as 0.
+ If the rank of A is less than the number of columns of A or greater than
+ the number of rows, resids will be returned as an empty array.
+\begin_inset LatexCommand index
+name "linalg|)"
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Section
+Discrete Fourier Transforms (
+\family typewriter
+fft
+\family default
+)
+\end_layout
+
+\begin_layout Standard
+\begin_inset LatexCommand index
+name "fft|("
+
+\end_inset
+
+All of the algorithms here are most efficient if the length of the data
+ is a power of 2 (or decomposable into low prime factors).
+
+\end_layout
+
+\begin_layout Description
+fft (x, n=None, axis=-1)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Return, X, the N-point Discrete Fourier Transform (DFT) of x along the
+ given axis using a fast algorithm.
+ If N is larger than x.shape[axis], then x will be zero-padded.
+ If N is smaller than x.shape[axis], then the first N items will be used.
+ The result is computed for
+\begin_inset Formula $k=0\ldots n-1$
+\end_inset
+
+ from the formula:
+\end_layout
+
+\begin_layout Standard
+\begin_inset Formula \[
+X\left[k\right]=\sum_{m=0}^{n-1}x[m]\exp\left(-j\frac{2\pi km}{n}\right).\]
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Tip
+The fft returns values for
+\begin_inset Formula $k=0\ldots N-1$
+\end_inset
+
+.
+ Because
+\begin_inset Formula $X\left[N-k\right]=X[-k]$
+\end_inset
+
+ in the FFT formula, larger values of k correspond also to negative frequencies.
+\end_layout
+
+\begin_layout Description
+ifft (X, n=None, axis=-1)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Return the inverse of the fft so that (ifft(fft(a)) == a within numerical
+ precision.
+ The order of frequencies must be the same as returned by fft.
+ The result is computed (using a fast algorithm) for
+\begin_inset Formula $m=0\ldots n-1$
+\end_inset
+
+ from the formula:
+\end_layout
+
+\begin_layout Standard
+\begin_inset Formula \[
+x\left[m\right]=\frac{1}{n}\sum_{k=0}^{n-1}X\left[k\right]\exp\left(j\frac{2\pi km}{n}\right).\]
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+Sometimes having the
+\begin_inset Quotes eld
+\end_inset
+
+negative
+\begin_inset Quotes erd
+\end_inset
+
+ frequencies at the end of the output returned by fft can be a little confusing.
+ There are two ways to deal with this confusion.
+ In my opinion, the most useful way is to get a collection of DFT sample
+ frequencies and use them to keep track of where each frequency is.
+ The function
+\family typewriter
+fftfreq
+\family default
+ provides these sample frequencies.
+ Making an x-y plot, where the sample frequencies are along the
+\begin_inset Quotes eld
+\end_inset
+
+x
+\begin_inset Quotes erd
+\end_inset
+
+-axis and the result of the DFT is along the
+\begin_inset Quotes eld
+\end_inset
+
+y
+\begin_inset Quotes erd
+\end_inset
+
+-axis provides a useful visualization with the zero-frequency at the center
+ of the plot.
+ The advantage of this approach is that your data is still in proper order
+ for using the
+\family typewriter
+ifft
+\family default
+ function.
+ Some people, however, prefer to simply swap one-half of the output with
+ the other.
+ This is exactly what the function
+\family typewriter
+fftshift
+\family default
+ does.
+ Of course, now the data is not in the proper order for the ifft function,
+ but to each his own.
+
+\end_layout
+
+\begin_layout Standard
+The reason that the
+\begin_inset Quotes eld
+\end_inset
+
+negative
+\begin_inset Quotes erd
+\end_inset
+
+ frequencies are in the upper part of the return signal was given in the
+ description of the DFT.
+ The reason is that the output of the DFT is just one period of a periodic
+ function (with period
+\begin_inset Formula $n$
+\end_inset
+
+).
+ The traditional output of the FFT algorithm is to provide the portion of
+ the function from from
+\begin_inset Formula $k=0$
+\end_inset
+
+ to
+\begin_inset Formula $k=n-1$
+\end_inset
+
+.
+
+\end_layout
+
+\begin_layout Description
+fftshift (x, axes=None)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Shift zero-frequency component to the center of the spectrum.
+ This function swaps half-spaces for all axes listed (defaults to all of
+ them).
+
+\end_layout
+
+\begin_layout Description
+ifftshift (x, axes=None)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Reverse the effect of the fftshift operation.
+ Thus, it takes zero-centered data and shifts it into the correct order
+ for the ifft operation.
+\end_layout
+
+\begin_layout Description
+fftfreq (n, d=1.0)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Provide the DFT sample frequencies.
+ The returned float array contains the frequency bins in the order returned
+ from the fft function.
+ If given,
+\begin_inset Formula $d$
+\end_inset
+
+ represents the sample-spacing.
+ The units on the frequency bins are cycles / unit.
+ For example, the following example computes the output frequencies (in
+ Hz) of the fft of
+\begin_inset Formula $256$
+\end_inset
+
+ samples of a voice signal sampled at 20000Hz.
+\end_layout
+
+\begin_layout MyCode
+>>> from numpy.fft import fftfreq; f=fftfreq(256,d=1./20e3)
+\newline
+>>> print f[0],
+ f[1], f[2], f[128]
+\newline
+0.0 78.125 156.25 -10000.0
+\end_layout
+
+\begin_layout Description
+fft2 (x, s=None, axes=(-2,-1))
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Return the two-dimensional fft of the array x for each 2-d array formed
+ by axes.
+ The 2-d fft is computed as
+\begin_inset Formula \[
+X\left[k_{0},k_{1}\right]=\sum_{m_{0}=0}^{s[0]-1}\sum_{m_{1}=0}^{s[1]-1}x\left[m_{0},m_{1}\right]\exp\left(-j\frac{2\pi k_{0}m_{0}}{s[0]}\right)\exp\left[-j\frac{2\pi k_{1}m_{1}}{s\left[1\right]}\right]\]
+
+\end_inset
+
+ and can be realized by repeated application of the 1-d fft (first over
+ the axes[0] and then over axes[1]).
+ In other-words fft2(x,s,axes) is equivalent to fft(fft(x, s[0], axes[0]),
+ s[1], axes[1]).
+ The 2-d fft is returned for
+\begin_inset Formula $k_{0}=0\ldots s[0]-1$
+\end_inset
+
+ and
+\begin_inset Formula $k_{1}=0\ldots s[1]-1.$
+\end_inset
+
+ Symmetry (
+\begin_inset Formula $X\left[s[0]-k_{0},s[1]-k_{1}\right]=X[-k_{0},-k_{1}]$
+\end_inset
+
+) ensures that higher values of
+\begin_inset Formula $k_{i}$
+\end_inset
+
+ correspond to negative frequencies.
+
+\end_layout
+
+\begin_layout Description
+ifft2 (X, s=None, axes=(-2,-1))
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Return the inverse of the two-dimension fft.
+ Thus, ifft2(fft2(x)) == x to within numerical precision.
+ Note that the
+\begin_inset Quotes eld
+\end_inset
+
+negative frequencies
+\begin_inset Quotes erd
+\end_inset
+
+ must be
+\end_layout
+
+\begin_layout Description
+fftn (x, s=None, axes=None)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Return the
+\begin_inset Formula $N$
+\end_inset
+
+-dimensional fft of x.
+ If s is not given, then if axes is given, then
+\begin_inset Formula $N$
+\end_inset
+
+=len(axes), otherwise
+\begin_inset Formula $N$
+\end_inset
+
+=x.ndim.
+ If s is given, then
+\begin_inset Formula $N$
+\end_inset
+
+=len(s).
+ Results are computed using a similar formula as for the 1- and 2-d FFT
+ with
+\begin_inset Formula $N$
+\end_inset
+
+ summations.
+
+\end_layout
+
+\begin_layout Description
+ifftn (X, s=None, axes=None)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Return the
+\begin_inset Formula $N$
+\end_inset
+
+-dimensional inverse fft of
+\begin_inset Formula $X$
+\end_inset
+
+.
+ Note that ifftn(fftn(x)) == x to within machine precision.
+
+\end_layout
+
+\begin_layout Standard
+The Discrete Fourier transform returns complex-valued data (even for real-valued
+ input).
+ If the data was originally real-valued, then much of the output of the
+ full DFT is redundant.
+ Notice that if
+\begin_inset Formula $x\left[m\right]$
+\end_inset
+
+ is real, then
+\begin_inset Formula \begin{eqnarray*}
+X\left[n-k\right] & = & \sum_{m=0}^{n-1}x[m]\exp\left(-j\frac{2\pi\left(n-k\right)m}{n}\right)\\
+ & = & \left[\sum_{m=0}^{n-1}x\left[m\right]\exp\left(-j\frac{2\pi km}{n}\right)\right]^{*}\\
+ & = & X^{*}\left[k\right],\end{eqnarray*}
+
+\end_inset
+
+where
+\begin_inset Formula $a^{*}$
+\end_inset
+
+ denotes the complex-conjugate of
+\begin_inset Formula $a$
+\end_inset
+
+.
+ So, the upper half of the fft output (the negative frequencies) is determined
+ exactly by the lower half of the output when the input is purely real.
+ This kind of symmetry is called Hermitian symmetry.
+ The real-valued Fourier transforms described next take advantage of Hermitian
+ symmetry to compute only the unique outputs more quickly.
+
+\end_layout
+
+\begin_layout Standard
+The symmetry in higher dimensions is always about the origin.
+ If
+\begin_inset Formula $N$
+\end_inset
+
+ is the number of dimensions, then:
+\begin_inset Formula \[
+X[n_{1}-k_{1},n_{2}-k_{2},\ldots n_{N}-k_{N}]=X^{*}\left[k_{1},k_{2},\ldots,k_{N}\right].\]
+
+\end_inset
+
+Thus, the data-savings remains constant at about 1/2 for higher dimensions
+ as well.
+
+\end_layout
+
+\begin_layout Description
+rfft (x, n=None, axis=-1)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Compute the first n//2+1 points of the
+\begin_inset Formula $n$
+\end_inset
+
+-point discrete Fourier transform of the real valued data along the given
+ axis.
+ The returned array will be just the first half of the
+\family typewriter
+fft
+\family default
+, corresponding to positive frequencies: rfft(x) == fft(x)[:n//2+1]
+\end_layout
+
+\begin_layout Description
+irfft (X, n=None, axis=-1)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Compute the inverse
+\begin_inset Formula $n$
+\end_inset
+
+-point discrete Fourier transform along the given axis using the first n//2+1
+ points.
+ To within numerical precision, irfft(rfft(x))==x.
+
+\end_layout
+
+\begin_layout Description
+rfft2 (x, s=None, axes=(-2, -1))
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Compute only the first half-plane of the two-dimensional discrete Fourier
+ transform corresponding to unique values.
+ s[0] and
+\begin_inset Formula $s[1]$
+\end_inset
+
+-point DFTs will be computed along axes[0] and axes[1] dimensions, respectively.
+ Requires a real array.
+ If
+\begin_inset Formula $s$
+\end_inset
+
+ is None it defaults to the shape of
+\begin_inset Formula $x.$
+\end_inset
+
+ The real fft will be computed along the last axis specified in axes while
+ a full fft will be computed in the other dimension.
+\end_layout
+
+\begin_layout Description
+irfft2 (X, s=None, axes=(-2, -1))
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Compute the inverse of the 2-d DFT using only the first quadrant.
+ Returns a real array such that to within numerical precision irfft2(rfft2(x))==
+x.
+\end_layout
+
+\begin_layout Description
+rfftn (x, s=None, axes=None)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Compute only the unique part of the
+\begin_inset Formula $N$
+\end_inset
+
+-dimensional DFT from a real-valued array.
+ If
+\begin_inset Formula $s$
+\end_inset
+
+ is None it defaults to the shape of x.
+ If axes is not given it defaults to all the axes (-n,
+\begin_inset Formula $\ldots$
+\end_inset
+
+, -1).
+ The length of axes provides the dimensionality of the DFT.
+ The unique part of the real
+\begin_inset Formula $N$
+\end_inset
+
+-dimensional DFT is obtained by slicing the full fft along the last axis
+ specified and taking n//2+1 slices.
+ rfftn(x) == fft(x)[sliceobj] where sliceobj[axes[-1]] = slice(None,s[-1]//2+1,N
+one).
+\end_layout
+
+\begin_layout Description
+irfftn (X, s=None, axes=None)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Compute the inverse DFT from the unique portions of the N-dimensional DFT
+ provided by
+\family typewriter
+rfftn
+\family default
+.
+\end_layout
+
+\begin_layout Standard
+Occasionally, the situation may arise where you have complex-valued data
+ with Hermitian symmetry (or real-valued symmetric data).
+ This ensures that the Fourier transform will be real.
+ The two functions below can calculate it without wasting extra space for
+ the zero-valued imaginary entries of the Discrete Fourier transform, or
+ the entire signal.
+\end_layout
+
+\begin_layout Description
+hfft (x, n=None, axis=-1)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Calculate the
+\begin_inset Formula $n$
+\end_inset
+
+-point real-valued Fourier transform from (the first half of Hermitian-symmetric
+ data, x.
+
+\end_layout
+
+\begin_layout Description
+ihfft (X, n=None, axis=-1)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Return (the first half-of) Hermitian-symmetric data from the real-valued
+ Fourier transform, X.
+\begin_inset LatexCommand index
+name "fft|)"
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Section
+Random Numbers (
+\family typewriter
+random
+\family default
+)
+\end_layout
+
+\begin_layout Standard
+\begin_inset LatexCommand index
+name "random|("
+
+\end_inset
+
+The random number capabilities surpass those that were available in Numeric.
+ The random number facilities were generously contributed by Robert Kern,
+ who has been a dedicated and patient help to many mailing list questioners.
+ Robert built the random package using Pyrex to build on top of his own
+ code as well as that of randomkit by Jean-Sebastien Roy as well as code
+ by Ivan Frohne.
+ The fundamental random number generator is the Mersenne Twister based on
+ code written by Makoto Matsumoto and Takuji Nishimura (and modified for
+ Python by Raymond Hettinger).
+ Random numbers from discrete and continuous distributions are available,
+ as well as some useful random-number-related utilities.
+ Many of the random number generators are based on algorithms published
+ by Luc Devroye in
+\begin_inset Quotes eld
+\end_inset
+
+Non-Uniform Random Variate Generation
+\begin_inset Quotes erd
+\end_inset
+
+ available electronically at
+\begin_inset LatexCommand htmlurl
+target "http://cgm.cs.mcgill.ca/~luc/rnbookindex.html"
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+Each of the discrete and continuous random number generators take a size
+ keyword.
+ If this is None (default), then the size is determined from the additional
+ inputs (using ufunc-like broadcasting).
+ If no additional inputs are needed, or if these additional inputs are scalars,
+ then a single number is generated from the selected distribution.
+ If size is an integer, then a 1-d array of that size is generated filled
+ with random numbers from the selected distribution.
+ Finally, if size is a tuple, then an array of that shape is returned filled
+ with random numbers.
+
+\end_layout
+
+\begin_layout Standard
+Many distributions take additional inputs as parameters.
+ These additional inputs must be broadcastable to each other (and to the
+ size parameter if it is not None).
+ The broadcasting behavior of the additional inputs is ufunc-like.
+
+\end_layout
+
+\begin_layout Subsection
+Discrete Distributions
+\end_layout
+
+\begin_layout Standard
+\begin_inset LatexCommand index
+name "random!discrete|("
+
+\end_inset
+
+Discrete random numbers take on only a countable number of values (typically
+ integers).
+ Each distribution has associated with it a probability mass function (pmf),
+
+\begin_inset Formula $p_{m}\left(k;\cdot\right),$
+\end_inset
+
+ that is defined as the probability that the returned random number is
+\begin_inset Formula $k$
+\end_inset
+
+.
+ The arguments after
+\begin_inset Formula $k$
+\end_inset
+
+ represent possible parameters to the distribution.
+ Thus, let
+\begin_inset Formula $X\left(\cdot\right)$
+\end_inset
+
+ represent the random number generator for a particular distribution.
+ Then,
+\begin_inset Formula \[
+p_{m}\left(k;\cdot\right)=\textrm{Probability}\left\{ X\left(\cdot\right)=k\right\} .\]
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+It will be useful to define the discrete indicator function,
+\begin_inset Formula $I_{S}\left(k\right),$
+\end_inset
+
+ where
+\begin_inset Formula $S$
+\end_inset
+
+ is a set of integers (often represented by an interval).
+
+\begin_inset Formula $I_{S}\left(k\right)=1$
+\end_inset
+
+ if
+\begin_inset Formula $k\in S$
+\end_inset
+
+, otherwise
+\begin_inset Formula $I_{S}\left(k\right)=0.$
+\end_inset
+
+ This convenient notation isolates the relevance of a particular functional
+ form to a certain range.
+ Also, the formulas below make use of the following definition:
+\begin_inset Formula \[
+\left(\begin{array}{c}
+n\\
+k\end{array}\right)=\frac{n!}{k!\left(n-k\right)!}\]
+
+\end_inset
+
+ where
+\begin_inset Formula $k!=k\cdot\left(k-1\right)\cdot\cdots\cdot2\cdot1.$
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+binomial (n, p, size=None)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ This random number models the number of successes in
+\begin_inset Formula $n$
+\end_inset
+
+ independent trials of a random experiment where the probability of success
+ in each experiment is
+\begin_inset Formula $p$
+\end_inset
+
+.
+
+\begin_inset Formula \[
+p_{m}\left(k\right)=\left(\begin{array}{c}
+n\\
+k\end{array}\right)p^{k}\left(1-p\right)^{n-k}I_{\left[0,n\right]}\left(k\right).\]
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+geometric (p, size=None)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ This random number models the number of (independent) attempts required
+ to obtain a success where the probability of success on each attempt is
+
+\begin_inset Formula $p$
+\end_inset
+
+.
+
+\end_layout
+
+\begin_layout Standard
+\begin_inset Formula \[
+p_{m}\left(k;p\right)=\left(1-p\right)^{k-1}p\, I_{\left[1,\infty\right)}\left(k\right).\]
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+hypergeometric (ngood, nbad, nsample, size=None)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Imagine a probability theorists favorite urn filled with
+\begin_inset Formula $n_{g}$
+\end_inset
+
+
+\begin_inset Quotes eld
+\end_inset
+
+good
+\begin_inset Quotes erd
+\end_inset
+
+ objects and
+\begin_inset Formula $n_{b}$
+\end_inset
+
+
+\begin_inset Quotes eld
+\end_inset
+
+bad
+\begin_inset Quotes erd
+\end_inset
+
+ objects.
+ In other words there are two types of objects in a jar.
+ The hypergeometric random number models how many
+\begin_inset Quotes eld
+\end_inset
+
+good
+\begin_inset Quotes erd
+\end_inset
+
+ objects will be present when
+\begin_inset Formula $N$
+\end_inset
+
+ items are taken out of the urn without replacement.
+\end_layout
+
+\begin_layout Standard
+\begin_inset Formula \[
+p\left(k;n_{g},n_{b},N\right)=\frac{\left(\begin{array}{c}
+n_{g}\\
+k\end{array}\right)\left(\begin{array}{c}
+n_{b}\\
+N-k\end{array}\right)}{\left(\begin{array}{c}
+n_{g}+n_{b}\\
+N\end{array}\right)}I_{\left[N-n_{b},\textrm{min}\left(n,N\right)\right]}\left(k\right).\]
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+logseries (p, size=None)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ A random number whose pmf with terms proportional to the Taylor series
+ expansion of
+\begin_inset Formula $\log\left(1-p\right)$
+\end_inset
+
+.
+ It has been used in biological studies to model the species abundance distribut
+ion.
+
+\begin_inset Formula \[
+p_{m}\left(k;p\right)=-\frac{p^{k}}{k\log\left(1-p\right)}\, I_{\left[1,\infty\right)}\left(k\right).\]
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+multinomial (n, pvals, size=None)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ This generator produces random vectors of length
+\begin_inset Formula $N$
+\end_inset
+
+ where
+\begin_inset Formula $N=\textrm{len}\left(pvals\right)$
+\end_inset
+
+.
+ The shape of the returned array is always the shape indicated by size +
+ (
+\begin_inset Formula $N,$
+\end_inset
+
+).
+ The multinomial distribution is a generalization of the binomial distribution.
+ This time,
+\begin_inset Formula $n$
+\end_inset
+
+ trials of an experiment are independently repeated but each trial results
+ in
+\begin_inset Formula $N$
+\end_inset
+
+ possible integers
+\begin_inset Formula $k_{1},k_{2},\ldots,k_{N}$
+\end_inset
+
+ with
+\begin_inset Formula $\sum_{i=1}^{N}k_{i}=n.$
+\end_inset
+
+
+\begin_inset Formula \begin{eqnarray*}
+p_{m}\left(k_{1},k_{2},\ldots,k_{N};\cdot\right) & = & \textrm{Probability}\left\{ X\left(\cdot\right)=\left[k_{1},k_{2},\cdots,k_{N}\right]\right\} \\
+ & = & \frac{n!}{k_{1}!k_{2}!\cdots k_{N}!}p_{1}^{k_{1}}p_{2}^{k_{2}}\cdots p_{N}^{k_{N}}\end{eqnarray*}
+
+\end_inset
+
+where
+\begin_inset Formula $pvals=[p_{1},p_{2},\ldots,p_{N}].$
+\end_inset
+
+ It must be true that
+\begin_inset Formula $\sum_{i=1}^{N}p_{i}=1.$
+\end_inset
+
+ Therefore, as long as
+\begin_inset Formula $\sum_{i=1}^{N-1}p_{i}\leq1,$
+\end_inset
+
+ the last entry in
+\begin_inset Formula $pvals$
+\end_inset
+
+ is computed as
+\begin_inset Formula $1-\sum_{i=1}^{N-1}p_{i}$
+\end_inset
+
+.
+\end_layout
+
+\begin_layout Description
+negative_binomial (n, p, size=None)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Models the number of extra independent trials (beyond
+\begin_inset Formula $n$
+\end_inset
+
+) required to accumulate a total of
+\begin_inset Formula $n$
+\end_inset
+
+ successes where the probability of success on each trial is
+\begin_inset Formula $p.$
+\end_inset
+
+ Equivalently, this random number models the number of failures encountered
+ while accumulating
+\begin_inset Formula $n$
+\end_inset
+
+ successes during independent trials of the experiment that succeeds with
+ probability,
+\begin_inset Formula $p$
+\end_inset
+
+.
+
+\end_layout
+
+\begin_layout Standard
+\begin_inset Formula \[
+p_{m}\left(k;n,p\right)=\left(\begin{array}{c}
+k+n-1\\
+n-1\end{array}\right)p^{n}\left(1-p\right)^{k}\, I_{\left[0,\infty\right)}\left(k\right).\]
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+poisson (lam=1.0, size=None)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ This random number counts the number of successes in
+\begin_inset Formula $n$
+\end_inset
+
+ independent experiments (where the probability of success in each experiment
+ is
+\begin_inset Formula $p$
+\end_inset
+
+) in the limit as
+\begin_inset Formula $n\rightarrow\infty$
+\end_inset
+
+ and
+\begin_inset Formula $p\rightarrow0$
+\end_inset
+
+ gets very small such that
+\begin_inset Formula $\lambda=np\geq0$
+\end_inset
+
+ is a constant.
+ It can be used, for example, to model how many typographical errors are
+ on each page of a book.
+\end_layout
+
+\begin_layout Standard
+\begin_inset Formula \[
+p\left(k;\lambda\right)=e^{-\lambda}\frac{\lambda^{k}}{k!}\, I_{\left[0,\infty\right)}\left(k\right).\]
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+zipf (a, size=None)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ The probability mass function of this random number (also called the zeta
+ distribution) is
+\begin_inset Formula \[
+p_{m}\left(k;a\right)=\frac{1}{\zeta\left(a\right)k^{a}}\, I_{\left[1,\infty\right)}\left(k\right),\]
+
+\end_inset
+
+where
+\begin_inset Formula \[
+\zeta\left(a\right)=\sum_{n=1}^{\infty}\frac{1}{n^{a}}\]
+
+\end_inset
+
+is the Riemann zeta function.
+ Zipf distributions have been shown to characterize use of words in a natural
+ language (like English), the popularity of library books, and even the
+ use of the web.
+ The Zipf distribution describes collections that have a few items whose
+ probability of selection is very high, a medium number of items whose probabili
+ty of selection is medium, and a huge number of items whose probability
+ of selection is very low.
+\begin_inset LatexCommand index
+name "random!discrete|)"
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Subsection
+Continuous Distributions
+\end_layout
+
+\begin_layout Standard
+\begin_inset LatexCommand index
+name "random!continuous|("
+
+\end_inset
+
+Continuous random numbers can take on an uncountable number of values.
+ Therefore, the value returned by a continuous distribution is denoted
+\begin_inset Formula $x$
+\end_inset
+
+.
+ Because there is an uncountable number of possibilities for the random
+ number
+\begin_inset Foot
+status open
+
+\begin_layout Standard
+A computer actually always generates a random number from a discrete distributio
+n because there are only a finite set of numbers that can be represented
+ by a computer.
+ However, for continuous random number generators, the resulting random
+ numbers usually approximate the continuous distribution well enough to
+ ignore the subtlety.
+\end_layout
+
+\end_inset
+
+, a continuous distribution is modeled by a probability density function,
+
+\begin_inset Formula $f\left(x;\cdot\right).$
+\end_inset
+
+ To obtain the probability that the random number generated by
+\begin_inset Formula $X\left(\cdot\right)$
+\end_inset
+
+ is in a certain interval, we integrate this density function:
+\begin_inset Formula \[
+\int_{-\infty}^{b}f\left(x\right)dx=\textrm{Probability}\left\{ X\left(\cdot\right)\leq b\right\} .\]
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+To obtain a probability, we have to integrate
+\begin_inset Formula $f\left(x\right)$
+\end_inset
+
+ which is why it is called a density function.
+ Most continuous distributions are defined by their probability density
+ functions (pdf).
+ Some have basic origins, a few are derived from other distributions, and
+ some are used mainly for modelling unknown distributions.
+
+\end_layout
+
+\begin_layout Standard
+Some of the parameters of the distributions are labeled as location (
+\emph on
+loc
+\emph default
+) and
+\emph on
+scale
+\emph default
+ parameters.
+ These parameters are not shown in the equation for the pdf.
+ because they affect the distribution in a known way.
+ This is due to the fact that if
+\begin_inset Formula $X$
+\end_inset
+
+ is a number drawn from a distribution with pdf
+\begin_inset Formula $f_{X}\left(x\right),$
+\end_inset
+
+ then
+\begin_inset Formula $Y=Sx+L$
+\end_inset
+
+ is a number drawn from a distribution with pdf
+\begin_inset Formula \[
+f_{Y}\left(y\right)=\frac{1}{S}f_{X}\left(\frac{y-L}{S}\right).\]
+
+\end_inset
+
+ Thus, from the standard from provided, the pdf of the actual random numbers
+ generated by fixing the location and scale parameters can be quickly found.
+\end_layout
+
+\begin_layout Standard
+In this section, the indicator function
+\begin_inset Formula $I_{A}\left(x\right)$
+\end_inset
+
+ will be used where
+\begin_inset Formula $A$
+\end_inset
+
+ is a set defined over all the real numbers.
+ For clarity,
+\begin_inset Formula \[
+I_{A}\left(x\right)=\left\{ \begin{array}{cc}
+1 & x\in A,\\
+0 & x\not\in A.\end{array}\right.\]
+
+\end_inset
+
+ Also, the following functions are used in the definitions:
+\begin_inset Formula \begin{eqnarray*}
+\Gamma\left(x\right) & = & \int_{0}^{\infty}t^{x-1}e^{-t}dt=\left(x-1\right)\Gamma\left(x-1\right),\\
+B\left(a,b\right) & = & \frac{\Gamma\left(a\right)\Gamma\left(b\right)}{\Gamma\left(a+b\right)}.\end{eqnarray*}
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+beta (
+\begin_inset Formula $a$
+\end_inset
+
+,
+\begin_inset Formula $b$
+\end_inset
+
+, size=None)
+\end_layout
+
+\begin_layout Standard
+\begin_inset Formula \[
+f\left(x;a,b\right)=\frac{1}{B\left(a,b\right)}x^{a-1}\left(1-x\right)^{b-1}I_{\left(0,1\right)}\left(x\right).\]
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+chisquare (
+\begin_inset Formula $\nu$
+\end_inset
+
+, size=None)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ If
+\begin_inset Formula $Z_{1},\ldots,Z_{\nu}$
+\end_inset
+
+ are random numbers from standard normal distributions, then
+\begin_inset Formula $W=\sum_{k=1}^{\nu}Z_{k}^{2}$
+\end_inset
+
+ is a random number from the chi-square
+\begin_inset Formula $\left(\chi^{2}\right)$
+\end_inset
+
+ distribution with
+\begin_inset Formula $\nu$
+\end_inset
+
+ degrees of freedom.
+
+\end_layout
+
+\begin_layout Standard
+\begin_inset Formula \[
+f\left(x;\nu\right)=\frac{1}{2\Gamma\left(\frac{\nu}{2}\right)}\left(\frac{x}{2}\right)^{\nu/2-1}e^{-x/2}I_{\left[0,\infty\right)}\left(x\right).\]
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+dirichlet (
+\begin_inset Formula $\boldsymbol{\alpha},$
+\end_inset
+
+ size=None)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ A vector of random numbers which are drawn from a multivariate Dirichlet
+ distribution.
+ The length of the parameter vector,
+\begin_inset Formula $\boldsymbol{\alpha},$
+\end_inset
+
+ is the length,
+\begin_inset Formula $N$
+\end_inset
+
+, of the random vector.
+ The joint pdf is:
+\end_layout
+
+\begin_layout Description
+\begin_inset Formula \[
+f\left(\mathbf{x},\boldsymbol{\alpha}\right)=\frac{\prod_{i=1}^{N}\Gamma\left(\alpha_{i}\right)}{\Gamma\left(\sum_{i=1}^{N}\alpha_{i}\right)}\prod_{i=1}^{N}x_{i}^{\alpha_{i}-1}.\]
+
+\end_inset
+
+
+\series medium
+
+\end_layout
+
+\begin_layout Description
+exponential (scale=1.0, size=None)
+\end_layout
+
+\begin_layout Standard
+\begin_inset Formula \[
+f\left(x\right)=e^{-x}I_{\left[0,\infty\right)}\left(x\right).\]
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+f (
+\begin_inset Formula $\nu_{1}$
+\end_inset
+
+,
+\begin_inset Formula $\nu_{2}$
+\end_inset
+
+, size=None)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ The distribution of
+\begin_inset Formula $\frac{X_{1}/\nu_{1}}{X_{2}/\nu_{2}}$
+\end_inset
+
+ where
+\begin_inset Formula $X_{i}$
+\end_inset
+
+ is chi-squared with
+\begin_inset Formula $\nu_{i}$
+\end_inset
+
+ degrees of freedom.
+\end_layout
+
+\begin_layout Standard
+\begin_inset Formula \[
+f\left(x;\nu_{1},\nu_{2}\right)=\frac{\nu_{2}^{\nu_{2}/2}\nu_{1}^{\nu_{1}/2}x^{\nu_{1}/2-1}}{\left(\nu_{2}+\nu_{1}x\right)^{\left(\nu_{1}+\nu_{2}\right)/2}B\left(\frac{\nu_{1}}{2},\frac{\nu_{2}}{2}\right)}I_{\left[0,\infty\right)}\left(x\right).\]
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+gamma (
+\begin_inset Formula $a$
+\end_inset
+
+, scale=1.0, size=None)
+\end_layout
+
+\begin_layout Standard
+\begin_inset Formula \[
+f\left(x;a\right)=\frac{1}{\Gamma\left(a\right)}x^{a-1}e^{-x}I_{\left[0,\infty\right)}\left(x\right).\]
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+gumbel (loc=0.0, scale=1.0, size=None)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ A right-skewed extreme value distribution.
+
+\end_layout
+
+\begin_layout Standard
+\begin_inset Formula \[
+f\left(x\right)=\exp\left[-x-e^{-x}\right].\]
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+laplace (loc=0.0, scale=1.0, size=None)
+\end_layout
+
+\begin_layout Standard
+\begin_inset Formula \[
+f\left(x\right)=\frac{1}{2}e^{-\left|x\right|}.\]
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+lognormal (
+\begin_inset Formula $\mu$
+\end_inset
+
+=0.0,
+\begin_inset Formula $\sigma$
+\end_inset
+
+=1.0, size=None)
+\end_layout
+
+\begin_layout Standard
+\begin_inset Formula \[
+f\left(x;\mu,\sigma\right)=\frac{1}{\sigma x\sqrt{2\pi}}\exp\left[-\frac{1}{2}\left(\frac{\log x-\mu}{\sigma}\right)^{2}\right]I_{\left[0,\infty\right)}\left(x\right),\]
+
+\end_inset
+
+The parameters,
+\begin_inset Formula $\mu$
+\end_inset
+
+ and
+\begin_inset Formula $\sigma$
+\end_inset
+
+ are not the mean and variance of this distribution, but the parameters
+ of the underlying normal distribution.
+ Random numbers from this distribution are generated as
+\begin_inset Formula $e^{\sigma Z+\mu}$
+\end_inset
+
+ where
+\begin_inset Formula $Z$
+\end_inset
+
+ is a standard normal random number.
+
+\end_layout
+
+\begin_layout Description
+logistic (loc=0.0, scale=1.0, size=None)
+\begin_inset Formula \[
+f\left(x\right)=\frac{e^{-x}}{\left[1+e^{-x}\right]^{2}}I_{\left[0,\infty\right)}\left(x\right)\]
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+multivariate_normal (
+\begin_inset Formula $\mathbf{\boldsymbol{\mu}}$
+\end_inset
+
+,
+\begin_inset Formula $\mathbf{C}$
+\end_inset
+
+, size=None)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Returns a vector of random numbers which are jointly drawn from a multivariate
+ normal distribution.
+ The last-dimension of the output array contains the sample vector, which
+ is of length
+\begin_inset Formula $N=\textrm{len}\left(mean\right).$
+\end_inset
+
+ The covariance matrix must be
+\begin_inset Formula $N\times N$
+\end_inset
+
+.
+ If
+\begin_inset Formula $\boldsymbol{\mu}\equiv mean$
+\end_inset
+
+ and
+\begin_inset Formula $\mathbf{C}=cov$
+\end_inset
+
+, then the joint-pdf representing the returned random vector(s) is
+\begin_inset Formula \[
+f\left(\mathbf{x}\right)=\frac{1}{\sqrt{\left(2\pi\right)^{N}\left|\mathbf{C}\right|}}\exp\left[-\frac{1}{2}\left(\mathbf{x}-\boldsymbol{\mu}\right)^{T}\mathbf{C}^{-1}\left(\mathbf{x}-\boldsymbol{\mu}\right)\right].\]
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+noncentral_chisquare (
+\begin_inset Formula $\nu$
+\end_inset
+
+,
+\begin_inset Formula $\lambda$
+\end_inset
+
+, size=None)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ This is the distribution of
+\begin_inset Formula $\sum_{i=1}^{\nu}\left(Z_{i}+\delta_{i}\right)^{2}$
+\end_inset
+
+ where
+\begin_inset Formula $Z_{i}$
+\end_inset
+
+ are independent standard normal random numbers and
+\begin_inset Formula $\delta_{i}$
+\end_inset
+
+ are constants.
+ It is a a generalized Rayleigh-Rice distribution:
+\end_layout
+
+\begin_deeper
+\begin_layout Standard
+\begin_inset Formula \[
+f\left(x;\nu,\lambda\right)=e^{-\left(\lambda+x\right)/2}\frac{1}{2}\left(\frac{x}{\lambda}\right)^{\left(\nu-2\right)/4}I_{\left(\nu-2\right)/2}\left(\sqrt{\lambda x}\right)I_{\left(0,\infty\right)}\left(x\right),\]
+
+\end_inset
+
+ where
+\begin_inset Formula $I_{\nu}\left(z\right)$
+\end_inset
+
+ (a real-number in the subscript, not an interval) is the modified Bessel
+ Function of the first kind.
+
+\end_layout
+
+\end_deeper
+\begin_layout Description
+noncentral_f (
+\begin_inset Formula $\nu_{1}$
+\end_inset
+
+,
+\begin_inset Formula $\nu_{2}$
+\end_inset
+
+,
+\begin_inset Formula $\lambda$
+\end_inset
+
+, size=None)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ The pdf of this distribution is
+\begin_inset Formula \begin{eqnarray*}
+f\left(x;\nu_{1},\nu_{2},\lambda\right) & = & \exp\left[\frac{\lambda}{2}+\frac{\lambda v_{1}x}{2\left(\nu_{1}x+\nu_{2}\right)}\right]\nu_{1}^{\nu_{1}/2}\nu_{2}^{\nu_{2}/2}x^{\nu_{1}/2-1}\\
+ & & \times\left(\nu_{2}+\nu_{1}x\right)^{-\left(\nu_{1}+\nu_{2}\right)/2}\\
+ & & \times\frac{\Gamma\left(\frac{\nu_{1}}{2}\right)\Gamma\left(1+\frac{\nu_{2}}{2}\right)L_{n_{2}/2}^{n_{1}/2-1}\left(-\frac{\lambda\nu_{1}x}{2\left(\nu_{1}x+\nu_{2}\right)}\right)}{B\left(\frac{\nu_{1}}{2},\frac{\nu_{2}}{2}\right)\Gamma\left(\frac{\nu_{1}+\nu_{2}}{2}\right)}.\end{eqnarray*}
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+normal (loc=0.0, scale=1.0, size=None)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ The normal, or Gaussian, distribution is the limiting distribution of independe
+nt samples from any sufficiently well-behaved distributions (this is the
+ content of the celebrated central limit theorem).
+ The normal distribution is also the distribution of maximum entropy when
+ the mean and variance alone are fixed.
+ These two facts account for its name as well as the wide variety of situations
+ that can be usefully modelled using the normal distribution.
+ Because it is so widely used, the full pdf with the location
+\begin_inset Formula $\left(\mu\right)$
+\end_inset
+
+ and scale
+\begin_inset Formula $\left(\sigma\right)$
+\end_inset
+
+ parameters is provided:
+\end_layout
+
+\begin_layout Standard
+\begin_inset Formula \[
+f\left(x\right)=\frac{1}{\sigma\sqrt{2\pi}}\exp\left[-\frac{\left(x-\mu\right)^{2}}{2\sigma^{2}}\right].\]
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+pareto (
+\begin_inset Formula $a$
+\end_inset
+
+, size=None)
+\end_layout
+
+\begin_layout Standard
+\begin_inset Formula \[
+f\left(x;a\right)=\frac{a}{x^{a+1}}I_{\left[1,\infty\right)}\left(x\right).\]
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+power (
+\begin_inset Formula $a$
+\end_inset
+
+, size=None)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ A special case of the beta distribution with
+\begin_inset Formula $b=1.$
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+\begin_inset Formula \[
+f\left(x;a\right)=ax^{a-1}I_{\left[0,1\right]}\left(x\right).\]
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+rand (
+\begin_inset Formula $d_{1}$
+\end_inset
+
+,
+\begin_inset Formula $d_{2}$
+\end_inset
+
+,
+\begin_inset Formula $\ldots$
+\end_inset
+
+,
+\begin_inset Formula $d_{n}$
+\end_inset
+
+)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ A convenient interface to obtain an array of shape
+\begin_inset Formula $\left(d_{1},d_{2},\ldots,d_{n}\right)$
+\end_inset
+
+ of uniform random numbers in the interval
+\begin_inset Formula $\left[0,1\right).$
+\end_inset
+
+ Notice the different convention for passing in the shape (as separate arguments
+ instead of a tuple).
+ The standard convention is used in the function numpy.random.random(shape)
+ for which this function is merely a convenient short-hand.
+ If you have a tuple named shape, then rand(*shape) will work correctly.
+\end_layout
+
+\begin_layout Description
+randint (low, high=None, size=None)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Equally probably random integers in the range
+\begin_inset Formula $low\leq x<high$
+\end_inset
+
+.
+ If
+\begin_inset Formula $high$
+\end_inset
+
+ is None, then the range is
+\begin_inset Formula $0\leq x<low$
+\end_inset
+
+.
+ Similar to random_integers, but check the difference on the bounds.
+\end_layout
+
+\begin_layout Description
+randn (
+\begin_inset Formula $d_{1}$
+\end_inset
+
+,
+\begin_inset Formula $d_{2}$
+\end_inset
+
+,
+\begin_inset Formula $\ldots$
+\end_inset
+
+,
+\begin_inset Formula $d_{n}$
+\end_inset
+
+)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ A convenient interface to obtain an array of shape
+\begin_inset Formula $\left(d_{1},d_{2},\ldots,d_{n}\right)$
+\end_inset
+
+ of standard normal
+\begin_inset Formula $\left(\mu=0,\,\sigma=1\right)$
+\end_inset
+
+ random numbers.
+ Notice the different convention for passing in the shape (as separate arguments
+ intead of a tuple).
+ The standard convention is used in the function numpy.random.standard_normal(shap
+e) for which this function is merely a convenient short-hand.
+ If you have a tuple named shape, then randn(*shape) will work correctly.
+\end_layout
+
+\begin_layout Description
+random_integers (low, high=None, size=None)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Equally probably random integers in the range
+\begin_inset Formula $low\leq x\leq high$
+\end_inset
+
+.
+ If high is None, then the range is
+\begin_inset Formula $1\leq x\leq low$
+\end_inset
+
+.
+ Similar to randint, but check the difference on the bounds.
+\end_layout
+
+\begin_layout Description
+rayleigh (scale=1.0, size=None)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Rayleigh-distributed random numbers can be obtained as
+\begin_inset Formula $X=\sqrt{Z_{1}^{2}+Z_{2}^{2}}$
+\end_inset
+
+ where
+\begin_inset Formula $Z_{i}$
+\end_inset
+
+ are independent standard normal random numbers.
+ The scale parameter is also the mode of the distribution (the value of
+
+\begin_inset Formula $X$
+\end_inset
+
+ with highest probability).
+
+\end_layout
+
+\begin_layout Standard
+\begin_inset Formula \[
+f\left(x\right)=xe^{-x^{2}/2}I_{[0,\infty)}\left(x\right)\]
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+standard_cauchy (size=None)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ A Cauchy distribution is a heavy-tailed distribution with no variance.
+ It's distribution is that of the ratio of two standard normal distributions
+
+\begin_inset Formula $Z_{1}/Z_{2}.$
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+\begin_inset Formula \[
+f\left(x\right)=\frac{1}{\pi\left(1+x^{2}\right)}.\]
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+standard_exponential (size=None)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ A standard exponetial random number with scale=1.0.
+ The pdf was given under the description of
+\family typewriter
+random.exponential
+\family default
+.
+\end_layout
+
+\begin_layout Description
+standard_gamma (
+\begin_inset Formula $a$
+\end_inset
+
+, size=None)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ A standard gamma random number with scale=1.0.
+ The pdf was given under the description of
+\family typewriter
+random.gamma
+\family default
+.
+\end_layout
+
+\begin_layout Description
+standard_normal (size=None)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ A zero-mean, unit-variance, normally distributed random number often denoted
+
+\begin_inset Formula $Z.$
+\end_inset
+
+
+\begin_inset Formula \[
+f\left(x\right)=\frac{1}{\sqrt{2\pi}}e^{-x^{2}/2}.\]
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+standard_t (
+\begin_inset Formula $\nu$
+\end_inset
+
+, size=None)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Often called Student's t distribution, this random number distribution
+ arises in the problem of estimating the mean of normally distributed samples
+ when the sample-size is small.
+ The first parameter,
+\begin_inset Formula $\nu$
+\end_inset
+
+, is the number of degrees of freedom of the distribution.
+
+\begin_inset Formula \[
+f\left(x;\nu\right)\frac{\Gamma\left(\frac{\nu+1}{2}\right)}{\sqrt{\pi\nu}\Gamma\left(\frac{\nu}{2}\right)\left[1+\frac{x^{2}}{\nu}\right]^{\frac{\nu+1}{2}}}.\]
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+triangular (left, mode, right, size=None)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Returns random numbers according to a triangularly-shaped density that
+ starts at left, peaks at mode, and ends at right.
+\end_layout
+
+\begin_layout Description
+uniform (low=0.0, high=1.0, size=None)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Returns random numbers that are equally probable over the range
+\begin_inset Formula $\left[low,\, high\right).$
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+vonmises (
+\begin_inset Formula $\mu$
+\end_inset
+
+,
+\begin_inset Formula $\kappa$
+\end_inset
+
+, size=None)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ A continuous distribution that is well suited for circular attributes such
+ as angles, time of day, day of the year, etc.
+ The mean direction is
+\begin_inset Formula $\mu$
+\end_inset
+
+ and concentration (or dispersion) parameter is
+\begin_inset Formula $\kappa.$
+\end_inset
+
+ For small
+\begin_inset Formula $\kappa$
+\end_inset
+
+ the distribution tends towards a uniform distribution over
+\begin_inset Formula $\left[-\pi,\pi\right].$
+\end_inset
+
+ For large
+\begin_inset Formula $\kappa$
+\end_inset
+
+, the distribution tends towards a normal distribution with mean
+\begin_inset Formula $\mu$
+\end_inset
+
+ and variance
+\begin_inset Formula $1/\kappa.$
+\end_inset
+
+
+\begin_inset Formula \[
+f\left(x\right)=\frac{e^{\kappa\cos\left(x-\mu\right)}}{2\pi I_{0}\left(\kappa\right)}I_{\left[-\pi,\pi\right]}\left(x\right).\]
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+wald (
+\begin_inset Formula $\mu$
+\end_inset
+
+,
+\begin_inset Formula $\lambda$
+\end_inset
+
+, size=None)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ This distribution is also called the inverse Gaussian distribution (and
+ the Wald distribution considered as a special case when
+\begin_inset Formula $\mu=\lambda$
+\end_inset
+
+).
+ It can be generated by noticing that if
+\begin_inset Formula $X$
+\end_inset
+
+ is a wald random number then
+\begin_inset Formula $\frac{\lambda\left(X-\mu\right)^{2}}{\mu^{2}X}$
+\end_inset
+
+ is the square of a standard normal random number (i.e.
+ it is chi-square with one degree of freedom).
+ The pdf is
+\begin_inset Formula \[
+f\left(x\right)=\sqrt{\frac{\lambda}{2\pi x^{3}}}e^{-\frac{\lambda\left(x-\mu\right)^{2}}{2\mu^{2}x}}.\]
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Description
+weibull (
+\begin_inset Formula $a$
+\end_inset
+
+, size=None)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ An extreme-value distribution:
+\end_layout
+
+\begin_layout Standard
+\begin_inset Formula \[
+f\left(x;c\right)=ax^{a-1}\exp\left(-x^{a}\right)I_{\left(0,\infty\right)}\left(x\right).\]
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Subsection
+Miscellaneous utilities
+\end_layout
+
+\begin_layout Description
+bytes (length)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Return a string of random bytes of the provided length.
+\end_layout
+
+\begin_layout Description
+get_state ()
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Return an object that holds the state of the random number generator (allows
+ you to restart simulations where you left off).
+\end_layout
+
+\begin_layout Description
+set_state (state)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Set the state of the random number generator.
+ The argument should be the returned object of a previous get_state command.
+\end_layout
+
+\begin_layout Description
+shuffle (sequence)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Randomly permute the items of any sequence.
+ If sequence is an array, then it must be 1-d.
+\end_layout
+
+\begin_layout Description
+permutation (n)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Return a permutation of the integers from 0 to n-1.
+
+\begin_inset LatexCommand index
+name "random!continuous|)"
+
+\end_inset
+
+
+\begin_inset LatexCommand index
+name "random|)"
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Section
+Matrix-specific functions (matlib)
+\end_layout
+
+\begin_layout Standard
+This module contains functions that are geared specifically toward matrix
+ objects.
+ In particular it includes the functions
+\series bold
+empty
+\series default
+,
+\series bold
+ones
+\series default
+,
+\series bold
+zeros
+\series default
+,
+\series bold
+identity
+\series default
+,
+\series bold
+eye
+\series default
+,
+\series bold
+rand
+\series default
+, and
+\series bold
+randn
+\series default
+ each of which returns a matrix object by default instead of an ndarray
+ object.
+\end_layout
+
+\begin_layout Section
+Ctypes utiltity functions (ctypeslib)
+\end_layout
+
+\begin_layout Standard
+\begin_inset LatexCommand index
+name "ctypeslib"
+
+\end_inset
+
+This module contains utility functions that make it easier to work with
+ the ctypes module.
+
+\end_layout
+
+\begin_layout Description
+load_library (name, path)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Load a shared library named
+\begin_inset Quotes eld
+\end_inset
+
+name
+\begin_inset Quotes erd
+\end_inset
+
+ (use the full name including any prefix but excluding the extension) located
+ in the directory indicated by path and return a ctypes library object whose
+ attributes are the functions in the library.
+ If ctypes is not available, this function will raise an ImportError.
+ If there is an error loading the library, ctypes raises an OSError.
+ The extension is appended to the library name (on a platform-dependent
+ basis) unless the name includes the
+\begin_inset Quotes eld
+\end_inset
+
+.
+\begin_inset Quotes erd
+\end_inset
+
+ character in which case name is assumed to be the
+\begin_inset Quotes eld
+\end_inset
+
+full-name
+\begin_inset Quotes erd
+\end_inset
+
+ of the library.
+
+\end_layout
+
+\begin_layout Description
+ndpointer (dtype=None, ndim=None, shape=None, flags=None)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Create a class object that can be used in the argtypes list of a ctypes
+ function that will do basic type, number-of-dimensions, shape, and flags
+ checking on input array objects.
+ Setting an argtypes entry with the result of this function allows passing
+ arrays directly to ctypes-wrapped functions.
+ The returned class object will contain a from_param method as required
+ by ctypes.
+ This from_param method takes the array object, does data-type, number-of-dimens
+ions, shape, and flags checking on the object and if all tests pass returns
+ an object that ctypes can use as the data area of the array.
+ Checking is not performed for any entries which are None in this class
+ creation function.
+
+\end_layout
+
+\begin_layout Chapter
+Testing and Packaging
+\end_layout
+
+\begin_layout Quotation
+Research is what I'm doing when I don't know what I'm doing.
+\end_layout
+
+\begin_layout Right Address
+---
+\emph on
+Werner von Braun
+\end_layout
+
+\begin_layout Quotation
+The most likely way for the world to be destroyed, most experts agree, is
+ by accident.
+ That's where we come in; we're computer professionals.
+ We cause accidents.
+\end_layout
+
+\begin_layout Right Address
+---
+\emph on
+Nathaniel Borenstein
+\end_layout
+
+\begin_layout Standard
+There are two additional sub-packages distributed with NumPy that simplify
+ the process of distributing and testing code based on NumPy.
+ The numpy.distutils sub-package extends the standard distutils package to
+ handle Fortran code along with providing support for the auto-generated
+ code in NumPy.
+ The numpy.testing sub-package defines a few functions and classes for standardiz
+ing unit-tests in NumPy.
+ These facilities can be used in your own packages that build on top of
+ NumPy.
+
+\end_layout
+
+\begin_layout Section
+Testing
+\end_layout
+
+\begin_layout Standard
+In this sub-package are two classes and some useful utilities for writing
+ unit-tests
+\end_layout
+
+\begin_layout Description
+NumpyTestCase a subclass of unittest.TestCase which adds a measure method
+ that can determine the elasped time to execute a code string and enhances
+ the __call__ method
+\end_layout
+
+\begin_layout Description
+NumpyTest the test manager for NumPy which was extracted originally from
+ the SciPy code base.
+ This test manager makes it easy to add unit-tests to a package simply by
+ creating a tests sub-directory with files named test_<module>.py.
+ These test files should then define sub-classes of NumpyTestCase (or unittest.Te
+stCase) named
+\begin_inset Quotes eld
+\end_inset
+
+test*
+\begin_inset Quotes erd
+\end_inset
+
+.
+ These classes should then define functions named
+\begin_inset Quotes eld
+\end_inset
+
+test*
+\begin_inset Quotes erd
+\end_inset
+
+ or
+\begin_inset Quotes eld
+\end_inset
+
+bench*
+\begin_inset Quotes erd
+\end_inset
+
+ or
+\begin_inset Quotes eld
+\end_inset
+
+check*
+\begin_inset Quotes erd
+\end_inset
+
+ that contain the actual unit-tests.
+ The first keyword argument should specify the level above which this test
+ should be run.
+
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ To run the tests excecute NumpyTest(<package>).test(level=1, verbosity=1)
+ which will run all tests above the given level using the given verbosity.
+ Here <package> can be either a string or a previously imported module.
+ You can get the level and verbosity arguments from sys.argv using NumpyTest(<pac
+kage>).run() with -v or --verbosity and -l or --level as command-line arguments.
+\end_layout
+
+\begin_layout Description
+set_local_path (reldir='', level=1)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ prepend local directory (+ reldir) to sys.path.
+ The caller is responsible for removing this path using restore_path().
+\end_layout
+
+\begin_layout Description
+set_package_path (level=1)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ prepend package directory to sys.path.
+ This should be called from a test_file.py that satisfies the tree structure:
+ <somepath>/<somedir>/test_file.py.
+ The, the first existing path name from the list <somepath>/build/lib.<platform>-
+<version>, <somepath>/..
+ is pre-pended to sys.path.
+ The caller is responsible for removing this path using restore_path().
+\end_layout
+
+\begin_layout Description
+restore_path ()
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Remove the first entry from sys.path.
+\end_layout
+
+\begin_layout Description
+assert_equal (actual, desired, err_msg='', verbose=1)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Raise an assertion error if the two items are not equal.
+ Automatically calls assert_array_equal if actual or desired is an ndarray.
+
+\end_layout
+
+\begin_layout Description
+assert_almost_equal (actual, desired, decimal=7, err_msg='', verbose=1)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Raise an assertion error if the two items are not equal within decimal
+ places.
+ Automatically calls assert_array_almost_equal if actual or desired is an
+ ndarray.
+\end_layout
+
+\begin_layout Description
+assert_approx_equal (actual, desired, significant=7, err_msg='', verbose=1)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Raise an assertion error if the two items are not equal to within the given
+ significant digits.
+ Does not work on arrays.
+
+\end_layout
+
+\begin_layout Description
+assert_array_equal (x, y, err_msg='')
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Raise an error if the two arrays x and y are not equal at every element.
+
+\end_layout
+
+\begin_layout Description
+assert_array_less (x, y, err_msg='')
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Raise an error if the two arrays x and y have different shapes or if x
+ is not less than y at every element.
+
+\end_layout
+
+\begin_layout Description
+assert_array_almost_equal (x, y, decimal=6, err_msg='')
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Raise an error if x and y are not equal to decimal places at every element.
+\end_layout
+
+\begin_layout Description
+jiffies ()
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Return a number of 1/100ths of a second that this process has been scheduled
+ in user mode.
+ Implemented using time.time() unless on Linux where the special /proc directory
+ filesystem is used.
+
+\end_layout
+
+\begin_layout Description
+memusage ()
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Return the virtual memory size in bytes of the running python.
+ If the operation is not supported on the platform, then return None.
+ This works only on linux for now.
+\end_layout
+
+\begin_layout Description
+rand (*args)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Return an array of random numbers with the given shape using only the standard
+ library random number generator.
+\end_layout
+
+\begin_layout Description
+runstring (astr, dict)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Run the given string in the dictionary provided.
+ Functional form for (exec astr in dict) that is useful for the failUnlessRaises
+ method of unittest.TestCase class.
+\end_layout
+
+\begin_layout Section
+NumPy Distutils
+\end_layout
+
+\begin_layout Standard
+\begin_inset LatexCommand index
+name "distutils"
+
+\end_inset
+
+NumPy provides enhanced distutils functionality to make it easier to build
+ and install sub-packages, auto-generate code, and extension modules that
+ use Fortran-compiled libraries.
+ To use features of numpy distutils use the setup command from numpy.distutils.cor
+e.
+ A useful Configuration class is also provided in numpy.distutils.misc_util
+ that can make it easier to construct keyword arguments to pass to the setup
+ function (by passing the dictionary obtained from the todict() method of
+ the class).
+ More information is available in the NumPy Distutils Users Guide in <site-packa
+ges>/numpy/doc/DISTUTILS.txt.
+\end_layout
+
+\begin_layout Subsection
+misc_util
+\end_layout
+
+\begin_layout Description
+Configuration (package_name=None, parent_name=None, top_path=None, package_path=
+None, **attrs)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+
+\begin_inset LatexCommand index
+name "Configuration"
+
+\end_inset
+
+Construct a configuration instance for the given package name.
+ If parent_name is not None, then construct the package as a sub-package
+ of the parent_name package.
+ If top_path and package_path are None then they are assumed equal to the
+ path of the file this instance was created in.
+ The setup.py files in the numpy distribution are good examples of how to
+ use the Configuration instance.
+\end_layout
+
+\begin_deeper
+\begin_layout Description
+self.todict ()
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Return a dictionary compatible with the keyword arguments of distutils
+ setup function.
+ Thus, this method may be used as setup(**config.todict()).
+\end_layout
+
+\begin_layout Description
+self.get_distribution ()
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Return the distutils distribution object for self.
+\end_layout
+
+\begin_layout Description
+self.get_subpackage (subpackage_name, subpackage_path=None)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Return a Configuration instance for the sub-package given.
+ If subpackage_path is None then the path is assumed to be the local path
+ plus the subpackage_name.
+ If a setup.py file is not found in the subpackage_path, then a default configura
+tion is used.
+\end_layout
+
+\begin_layout Description
+self.add_subpackage (subpackage_name, subpackage_path=None)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Add a sub-package to the current Configuration instance.
+ This is useful in a setup.py script for adding sub-packages to a package.
+ The sub-package is contained in subpackage_path / subpackage_name and this
+ directory may contain a setup.py script or else a default setup (suitable
+ for Python-code-only subpackages) is assumed.
+ If the subpackage_path is None, then it is assumed to be located in the
+ local path / subpackage_name.
+
+\end_layout
+
+\begin_layout Description
+self.add_data_files (*files)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Add files to the list of data_files to be included with the package.
+ The form of each element of the files sequence is very flexible allowing
+ many combinations of where to get the files from the package and where
+ they should ultimately be installed on the system.
+ The most basic usage is for an element of the files argument sequence to
+ be a simple filename.
+ This will cause that file from the local path to be installed to the installati
+on path of the self.name package (package path).
+ The file argument can also be a relative path in which case the entire
+ relative path will be installed into the package directory.
+ Finally, the file can be an absolute path name in which case the file will
+ be found at the absolute path name but installed to the package path.
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ This basic behavior can be augmented by passing a 2-tuple in as the file
+ argument.
+ The first element of the tuple should specify the relative path (under
+ the package install directory) where the remaining sequence of files should
+ be installed to (it has nothing to do with the file-names in the source
+ distribution).
+ The second element of the tuple is the sequence of files that should be
+ installed.
+ The files in this sequence can be filenames, relative paths, or absolute
+ paths.
+ For absolute paths the file will be installed in the top-level package
+ installation directory (regardless of the first argument).
+ Filenames and relative path names will be installed in the package install
+ directory under the path name given as the first element of the tuple.
+ An example may clarify:
+\end_layout
+
+\begin_deeper
+\begin_layout LyX-Code
+self.add_data_files('foo.dat',
+\newline
+('fun', ['gun.dat', 'nun/pun.dat', '/tmp/sun.dat']),
+
+\newline
+'bar/cat.dat',
+\newline
+'/full/path/to/can.dat')
+\end_layout
+
+\begin_layout Standard
+will install these data files to:
+\end_layout
+
+\begin_layout LyX-Code
+<package install directory>/
+\newline
+ foo.dat
+\newline
+ fun/
+\newline
+ gun.dat
+\newline
+ nun/
+\newline
+ pun.dat
+\newline
+ sun.dat
+\newline
+
+ bar/
+\newline
+ car.dat
+\newline
+ can.dat
+\end_layout
+
+\begin_layout Standard
+where <package install directory> is the package (or sub-package) directory
+ such as '/usr/lib/python2.4/site-packages/mypackage' ('C:
+\backslash
+
+\backslash
+Python2.4
+\backslash
+
+\backslash
+Lib
+\backslash
+
+\backslash
+site-packages
+\backslash
+
+\backslash
+mypackage') or '/usr/lib/python2.4/site-packages/mypackage/mysubpackage'
+ ('C:
+\backslash
+
+\backslash
+Python2.4
+\backslash
+
+\backslash
+Lib
+\backslash
+
+\backslash
+site-packages
+\backslash
+
+\backslash
+mypackage
+\backslash
+
+\backslash
+mysubpackage').
+\end_layout
+
+\end_deeper
+\begin_layout Standard
+\InsetSpace ~
+ An additional feature is that the path to a data-file can actually be a
+ function that takes no arguments and returns the actual path(s) to the
+ data-files.
+ This is useful when the data files are generated while building the package.
+
+\end_layout
+
+\begin_layout Description
+self.add_data_dir (data_path)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Recursively add files under data_path to the list of data_files to be installed
+ (and distributed).
+ The data_path can be either a relative path-name, or an absolute path-name,
+ or a 2-tuple where the first argument shows where in the install directory
+ the data directory should be installed to.
+ For example suppose the source directory contains fun/foo.dat and fun/bar/car.dat
+\end_layout
+
+\begin_layout LyX-Code
+self.add_data_dir('fun')
+\newline
+self.add_data_dir(('sun', 'fun'))
+\newline
+self.add_data_dir(('gun',
+ '/full/path/to/fun'))
+\end_layout
+
+\begin_layout Standard
+\InsetSpace ~
+ Will install data-files to the locations
+\end_layout
+
+\begin_layout LyX-Code
+<package install directory>/
+\newline
+ fun/
+\newline
+ foo.dat
+\newline
+ bar/
+\newline
+ car.dat
+\newline
+ sun/
+\newline
+
+ foo.dat
+\newline
+ bar/
+\newline
+ car.dat
+\newline
+ gun/
+\newline
+ foo.dat
+\newline
+ car.dat
+\end_layout
+
+\begin_layout Description
+self.add_include_dirs (*paths)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Add the given sequence of paths to the beginning of the include_dirs list.
+ This list will be visible to all extension modules of the current package.
+\end_layout
+
+\begin_layout Description
+self.add_headers (*files)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Add the given sequence of files to the beginning of the headers list.
+ By default, headers will be installed under <python-include>/<self.name.replace('.
+','/')>/ directory.
+ If an item of files is a tuple, then its first argument specifies the actual
+ installation location relative to the <python-include> path.
+\end_layout
+
+\begin_layout Description
+self.add_extension (name, sources, **kw)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Create and add an Extension instance to the ext_modules list.
+ The first argument defines the name of the extension module that will be
+ installed under the self.name package.
+ The second argument is a list of sources.
+ This method also takes the following optional keyword arguments that are
+ passed on to the Extension constructor: include_dirs, define_macros, undef_macr
+os, library_dirs, libraries, runtime_library_dirs, extra_objects, swig_opts,
+ depends, language, f2py_options, module_dirs, and extra_info.
+
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ The self.paths(...) method is applied to all lists that may contain paths.
+ The extra_info is a dictionary or a list of dictionaries whose content
+ will be appended to the keyword arguments.
+ The depends list contains paths to files or directories that the sources
+ of the extension module depend on.
+ If any path in the depends list is newer than the extension module, then
+ the module will be rebuilt.
+
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ The list of sources may contain functions (called source generators) which
+ must take an extension instance and a build directory as inputs and return
+ a source file or list of source files or None.
+ If None is returned then no sources are generated.
+ If the Extension instance has no sources after processing all source generators
+, then no extension module is built.
+
+\end_layout
+
+\begin_layout Description
+self.add_library (name, sources, **build_info)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Add a library to the list of libraries.
+ Allowed keyword arguments are depends, macros, include_dirs, extra_compiler_arg
+s, and f2py_options.
+ The name is the name of the library to be built and sources is a list of
+ sources (or source generating functions) to add to the library.
+\end_layout
+
+\begin_layout Description
+self.add_scripts (*files)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Add the sequence of files to the beginning of the scripts list.
+ Scripts will be installed under the <prefix>/bin/ directory.
+
+\end_layout
+
+\begin_layout Description
+self.paths (*paths)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Applies glob.glob(...) to each path in the sequence (if needed) and pre-pends
+ the local_path if needed.
+ Because this is called on all source lists, this allows wildcard characters
+ to be specified in lists of sources for extension modules and libraries
+ and scripts and allows path-names be relative to the source directory.
+\end_layout
+
+\begin_layout Description
+self.get_config_cmd ()
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Returns the numpy.distutils config command instance.
+\end_layout
+
+\begin_layout Description
+self.get_build_temp_dir ()
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Return a path to a temporary directory where temporary files should be
+ placed.
+\end_layout
+
+\begin_layout Description
+self.have_f77c ()
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ True if a Fortran 77 compiler is available (because a simple Fortran 77
+ code was able to be compiled successfully).
+\end_layout
+
+\begin_layout Description
+self.have_f90c ()
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ True if a Fortran 90 compiler is available (because a simple Fortran 90
+ code was able to be compiled successfully)
+\end_layout
+
+\begin_layout Description
+self.get_version ()
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Return a version string of the current package or None if the version informati
+on could not be detected.
+ This method scans files named __version__.py, <packagename>_version.py, version.py
+, and __svn_version__.py for string variables version, __version__, and <packagen
+ame>_version, until a version number is found.
+\end_layout
+
+\begin_layout Description
+self.make_svn_version_py ()
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Appends a data function to the data_files list that will generate __svn_version
+__.py file to the current package directory.
+ This file will be removed from the source directory when Python exits (so
+ that it can be re-generated next time the package is built).
+ This is intended for working with source directories that are in an SVN
+ repository.
+
+\end_layout
+
+\begin_layout Description
+self.make_config_py ()
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Generate a package __config__.py file containing system information used
+ during the building of the package.
+ This file is installed to the package installation directory.
+\end_layout
+
+\begin_layout Description
+self.get_info (*names)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Return information (from system_info.get_info) for all of the names in the
+ argument list in a single dictionary.
+
+\end_layout
+
+\end_deeper
+\begin_layout Description
+get_numpy_include_dirs ()
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Return the include directory where the numpy/arrayobject.h and numpy/ufuncobject.
+h files are found.
+ This should be added to the include_dirs of any extension module built
+ using NumPy.
+ If numpy.distutils is used to build the extension, then this directory is
+ added automatically.
+
+\end_layout
+
+\begin_layout Description
+get_numarray_include_dirs ()
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Return the include directory where the numpy/libnumarray.h file is found.
+ This should be added to the include_dirs of any extension module that relies
+ on the Numarray-compatible C-API.
+
+\end_layout
+
+\begin_layout Description
+dict_append (d, **kwds)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Add the keyword arguments given as entries in the dictionary provided as
+ the first argument.
+ If the entry is already present, then assume it is a list and extend the
+ list with the keyword value.
+\end_layout
+
+\begin_layout Description
+appendpath (prefix, path)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Platform-independent intelligence for appending path to prefix.
+ It replaces '/' in the prefix and the path with the correct path-separator
+ on the platform ad returns a full path name that will be valid for the
+ platform.
+
+\end_layout
+
+\begin_layout Description
+allpath (name)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Convert a '/' separated pathname to one using the platform's path separator.
+\end_layout
+
+\begin_layout Description
+dot_join (*args)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Converts a sequence of string arguments to a string joined by '.' (removing
+ any empty strings).
+
+\end_layout
+
+\begin_layout Description
+generate_config_py (extension, build_dir)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ A suitable function that can be used in a source list.
+ This constructs a python file that contains system_info information used
+ during building the package.
+ Generally easier to use a Configuration instance and the config.make_config_py()
+ method.
+\end_layout
+
+\begin_layout Description
+get_cmd (cmdname, _cache={})
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Returns an instance of the distutils command object named cmdname if the
+ setup distribution instance has been initialized.
+ Caches the result in _cache[cmdname] and gets it from there if present.
+\end_layout
+
+\begin_layout Description
+terminal_has_colors ()
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Tries to determine if the stdout terminal can be written to using ANSI
+ colors.
+ Returns 1 if it can be determined that ANSI colors are acceptable or 0
+ if not.
+
+\end_layout
+
+\begin_layout Description
+red_text (s)
+\end_layout
+
+\begin_layout Description
+green_text (s)
+\end_layout
+
+\begin_layout Description
+yellow_text (s)
+\end_layout
+
+\begin_layout Description
+blue_text (s)
+\end_layout
+
+\begin_layout Description
+cyan_text (s)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ If terminal_has_colors() is true, then these commands return a string with
+ the necessary codes prepended to display the given string argument in the
+ specified color on an ANSI terminal.
+ If terminal_has_colors() is false, then these functions simply return the
+ input argument.
+
+\end_layout
+
+\begin_layout Description
+cyg2win32 (path)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Convert a cygwin path beginning with /cygdrive to a standard win32 path
+ name.
+
+\end_layout
+
+\begin_layout Description
+all_strings (lst)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Return True if all items in the input list are string objects otherwise
+ return False.
+\end_layout
+
+\begin_layout Description
+has_f_sources (sources)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Return True if any of the source files listed in the input argument are
+ Fortran files because its name matches against the compiled regular expression
+
+\series bold
+fortran_ext_match
+\series default
+.
+\end_layout
+
+\begin_layout Description
+has_cxx_sources (sources)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Return True if any of the source files listed in the input argument are
+ C++ files because its name matches against the compiled regular expression
+
+\series bold
+cxx_ext_match
+\series default
+.
+\end_layout
+
+\begin_layout Description
+filter_sources (sources)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ From the provided list of sources, return four lists of filenames containing
+ C, C++, Fortran, and Fortran 90 module sources respectively.
+ The compiled regular expressions used in this search (which are also available
+ in the misc_util module) are cxx_ext_match, fortran_ext_match, f90_ext_match,
+ and f90_module_name_match.
+
+\end_layout
+
+\begin_layout Description
+get_dependencies (sources)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Scan the files in the sources list for include statements.
+\end_layout
+
+\begin_layout Description
+is_local_src_dir (directory)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Return True if the provided directory is the local current working directory.
+
+\end_layout
+
+\begin_layout Description
+get_ext_source_files (ext)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Get sources and any include files in the same directory from an Extension
+ instance.
+\end_layout
+
+\begin_layout Description
+get_script_files (scripts)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Returns the list scripts with all non-string arguments removed.
+\end_layout
+
+\begin_layout Subsection
+Other modules
+\end_layout
+
+\begin_layout Description
+system_info.get_info (name)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ For the given string representing a particular resource, return a dictionary
+ that is compatible with the distutils.setup keyword arguments.
+ If this is an empty dictionary, then the requested resource is not available.
+ Some of the names that can be checked are 'lapack_opt', 'blas_opt', 'fft_opt',
+ 'fftw', 'fftw3', 'fftw2', 'djbfft', 'numpy', 'numarray', 'boost_python',
+ 'agg2', 'wx', 'gdk', 'xft', 'freetype2'.
+
+\end_layout
+
+\begin_layout Description
+system_info.get_standard_file (filename)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Return a list of length 0 to 3 containing the full-path filenames for the
+ filename provided.
+ The filename is searched for in three places in the following order 1)
+ the system-wide location which is the directory that the system_info file
+ is located in; 2) the directory specified by the environment variable HOME;
+ and 3) the current local directory.
+
+\end_layout
+
+\begin_layout Description
+cpuinfo.cpu an instance of a cpuinfo class that defines methods for checking
+ various aspects of the cpu.
+ The info attribute is a list of length (# of CPUs).
+ Each entry is a dictionary providing technical information about that CPU.
+
+\end_layout
+
+\begin_layout Description
+log.set_verbosity (level)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Set the distutils logging threshold and return the previously stored value.
+ The level is an integer that corresponds to distutils.log thresholds: -1
+ <--> ERROR, 0 <--> WARN, 1 <--> INFO, and 2 <--> DEBUG.
+
+\end_layout
+
+\begin_layout Description
+exec_command
+\end_layout
+
+\begin_deeper
+\begin_layout Description
+exec_command (command, execute_in='', use_shell=None, use_tee=None, _with_python
+=1, **env)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Return (status, output) of the executed command.
+ The command input is a string of executable and arguments.
+ The output contains both stderr and stdout messages.
+ If execute_in is given, then change to the provided directory prior to
+ executing the command and afterwords restore to the current directory.
+ On NT, and DOS systems the returned status is correct for external commands.
+ However, wild cards will not work for non-posix systems.
+\end_layout
+
+\begin_layout Description
+splitcmdline (line)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Inverse of ' '.join(sys.argv)
+\end_layout
+
+\begin_layout Description
+find_executable (exe, path=None)
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Return full path of an executable using information from the PATH environment
+ variable.
+ Equivalent to the POSIX 'which' command.
+\end_layout
+
+\begin_layout Description
+get_pythonexe ()
+\end_layout
+
+\begin_layout Description
+\InsetSpace ~
+ Return the full path to the python executable with some fixes for nt and
+ dos to replace pythonw with python if it is encountered.
+ A basic wrapper around sys.executable.
+\end_layout
+
+\end_deeper
+\begin_layout Section
+Conversion of .src files
+\end_layout
+
+\begin_layout Standard
+\begin_inset LatexCommand index
+name "code generation"
+
+\end_inset
+
+NumPy distutils supports automatic conversion of source files named <somefile>.sr
+c.
+ This facility can be used to maintain very similar code blocks requiring
+ only simple changes between blocks.
+ During the build phase of setup, if a template file named <somefile>.src
+ is encountered, a new file named <somefile> is constructed from the template
+ and placed in the build directory to be used instead.
+ Two forms of template conversion are supported.
+ The first form occurs for files named named <file>.ext.src where ext is a
+ recognized Fortran extension (f, f90, f95, f77, for, ftn, pyf).
+ The second form is used for all other cases.
+
+\end_layout
+
+\begin_layout Subsection
+Fortran files
+\end_layout
+
+\begin_layout Standard
+This template converter will replicate all
+\series bold
+function
+\series default
+ and
+\series bold
+subroutine
+\series default
+ blocks in the file with names that contain '<...>' according to the rules
+ in '<...>'.
+ The number of comma-separated words in '<...>' determines the number of times
+ the block is repeated.
+ What these words are indicates what that repeat rule, '<...>', should be replaced
+ with in each block.
+ All of the repeat rules in a block must contain the same number of comma-separa
+ted words indicating the number of times that block should be repeated.
+ If the word in the repeat rule needs a comma, leftarrow, or rightarrow,
+ then prepend it with a backslash '
+\backslash
+'.
+ If a word in the repeat rule matches '
+\backslash
+
+\backslash
+<index>' then it will be replaced with the <index>-th word in the same repeat
+ specification.
+ There are two forms for the repeat rule: named and short.
+\end_layout
+
+\begin_layout Subsubsection
+Named repeat rule
+\end_layout
+
+\begin_layout Standard
+A named repeat rule is useful when the same set of repeats must be used
+ several times in a block.
+ It is specified using <rule1=item1, item2, item3,..., itemN>, where N is the
+ number of times the block should be repeated.
+ On each repeat of the block, the entire expression, '<...>' will be replaced
+ first with item1, and then with item2, and so forth until N repeats are
+ accomplished.
+ Once a named repeat specification has been introduced, the same repeat
+ rule may be used
+\series bold
+in the current block
+\series default
+ by referring only to the name (i.e.
+ <rule1>.
+
+\end_layout
+
+\begin_layout Subsubsection
+Short repeat rule
+\end_layout
+
+\begin_layout Standard
+A short repeat rule looks like <item1, item2, item3, ..., itemN>.
+ The rule specifies that the entire expression, '<...>' should be replaced
+ first with item1, and then with item2, and so forth until N repeats are
+ accomplished.
+
+\end_layout
+
+\begin_layout Subsubsection
+Pre-defined names
+\end_layout
+
+\begin_layout Standard
+The following predefined named repeat rules are available:
+\end_layout
+
+\begin_layout Itemize
+<prefix=s,d,c,z>
+\end_layout
+
+\begin_layout Itemize
+<_c=s,d,c,z>
+\end_layout
+
+\begin_layout Itemize
+<_t=real, double precision, complex, double complex>
+\end_layout
+
+\begin_layout Itemize
+<ftype=real, double precision, complex, double complex>
+\end_layout
+
+\begin_layout Itemize
+<ctype=float, double, complex_float, complex_double>
+\end_layout
+
+\begin_layout Itemize
+<ftypereal=float, double precision,
+\backslash
+
+\backslash
+0,
+\backslash
+
+\backslash
+1>
+\end_layout
+
+\begin_layout Itemize
+<ctypereal=float, double,
+\backslash
+
+\backslash
+0,
+\backslash
+
+\backslash
+1>
+\end_layout
+
+\begin_layout Subsection
+Other files
+\end_layout
+
+\begin_layout Standard
+Non-Fortran files use a separate syntax for defining template blocks that
+ should be repeated using a variable expansion similar to the named repeat
+ rules of the Fortran-specific repeats.
+ The template rules for these files are:
+\end_layout
+
+\begin_layout Enumerate
+\begin_inset Quotes eld
+\end_inset
+
+/**begin repeat
+\begin_inset Quotes erd
+\end_inset
+
+ on a line by itself marks the beginning of a segment that should be repeated.
+\end_layout
+
+\begin_layout Enumerate
+Named variable expansions are defined using #name=item1, item2, item3, ...,
+ itemN# and placed on successive lines.
+ These variables are replaced in each repeat block with corresponding word.
+ All named variables in the same repeat block must define the same number
+ of words.
+
+\end_layout
+
+\begin_layout Enumerate
+In specifying the repeat rule for a named variable, item*N is short-hand
+ for item, item, ..., item repeated N times.
+ In addition, parenthesis in combination with *N can be used for grouping
+ several items that should be repeated.
+ Thus, #name=(item1, item2)*4# is equivalent to #name=item1, item2, item1,
+ item2, item1, item2, item1, item2#
+\end_layout
+
+\begin_layout Enumerate
+\begin_inset Quotes eld
+\end_inset
+
+*/
+\begin_inset Quotes erd
+\end_inset
+
+ on a line by itself marks the end of the the variable expansion naming.
+ The next line is the first line that will be repeated using the named rules.
+\end_layout
+
+\begin_layout Enumerate
+Inside the block to be repeated, the variables that should be expanded are
+ specified as @name@.
+
+\end_layout
+
+\begin_layout Enumerate
+\begin_inset Quotes eld
+\end_inset
+
+/**end repeat**/
+\begin_inset Quotes erd
+\end_inset
+
+ on a line by itself marks the previous line as the last line of the block
+ to be repeated.
+
+\end_layout
+
+\begin_layout Standard
+\begin_inset Include \input{capi.lyx}
+preview false
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+\begin_inset LatexCommand printindex
+
+\end_inset
+
+
+\end_layout
+
+\end_body
+\end_document