#### Overview of this book

IPython Notebook Essentials
Credits
www.PacktPub.com
Preface
Free Chapter
A Tour of the IPython Notebook
The Notebook Interface
Graphics with matplotlib
Handling Data with pandas
Advanced Computing with SciPy, Numba, and NumbaPro
IPython Notebook Reference Card
A Brief Review of Python
NumPy Arrays
Index

## Indexing and Slicing

To illustrate indexing, let's first create an array with random data using the following command:

```import numpy.random
a = np.random.rand(6,5)
print a
```

This creates an array of dimension `(6,5)` that contains random data. Individual elements of the array are accessed with the usual index notation, for example, `a[2,4]`.

An important technique to manipulate data in `NumPy` is the use of slices. A slice can be thought of as a subarray of an array. For example, let's say we want to extract a subarray with the middle two rows and first two columns of the array `a`. Consider the following command lines:

```b = a[2:4,0:2]
print b
```

Now, let's make a very important observation. A slice is simply a view of an array, and no data is actually copied. This can be seen by running the following commands:

```b[0,0]=0
print a
```

So, changes in `b` affect the array `a`! If we really need a copy, we need to explicitly say we want one. This can be done using the following command line:

```c = np.copy(a[2:4,0:2])
c[0,0] = -1
print a
```

In the slice notation `i:j`, we can omit either `i` or `j`, in which case the slice refers to the beginning or end of the corresponding axis:

```print a[:4,3:]
```

Omitting both `i` and `j` refers to a whole axis:

```print a[:,2:4]
```

Finally, we can use the notation `i:j:k` to specify a stride `k` in the slice. In the following example, we first create a larger random array to illustrate this:

```a = np.random.rand(10,6)
print a
print
print a[1:7:2,5:0:-3]
```

Let's now consider slices of higher dimensional arrays. We will start by creating a really large three-dimensional array as follows:

```d1, d2, d3 = 4, 5, 3
a = np.random.rand(d1, d2, d3)
print a
```

Suppose we want to extract all elements with index `1` in the last axis. This can be done easily using an ellipsis object as follows:

```print a[...,1]
```

The preceding command line is equivalent to the following one:

```print a[:,:,1]
```

It is also possible to augment the matrix along an axis when slicing, as follows:

```print a[0, :, np.newaxis, 0]
```

Compare the output of the preceding command line with the output of the following:

```print a[0, :, 0]
```