# Indexing and slicing

Indexing and slicing allow you to access specific elements of an array - it is important to understand how this works for arrays of varying dimensions. Important to remember is that python is zero-indexed i.e. the first position in a list, an array or any other data structure has an index of zero.

## 1-dimensional indexing

Let’s start by making a simple array of random numbers:

``````rand=numpy.random.random(7)
``````

The best way to think about slicing an array is to imagine a syntax structure of `array[start_slice:end_slice:step]` (where not all of the variables (start_slice, end_slice, step) need to be set).

To get the first value of the array by index, type:

``````rand
``````

To get the first 3 values of the array `rand` by index, type:

``````rand[0:3]
``````

To take a slice, accessing all values:

``````rand[:]
``````

To take a slice and get all but the last value:

``````rand[:-1]
``````

To reverse the array:

``````rand[::-1]
``````

To get every second value:

``````rand[::2]
``````

All of the above can be assigned to a variable - it is worth taking notice the type of object that is created according to what is returned by the index/slice:

``````val=rand
val.dtype
``````

returns:

``````dtype('float64')
``````
``````skip=rand[::2]
type(skip)
``````

returns:

``````numpy.ndarray
``````

Try using `numpy.dtype(skip)` on this second example - why don’t you think it works? If you’re not sure, check the function documentation.

## 2-dimensional+ indexing

Let’s start by making a 2-dimensional random array:

``````rand2=numpy.random.random((5,3))
``````

Indexing in multiple dimensions is the same as for 1-dimension, except that your slice statements are specified per dimension. Accessing the dimensions of an array can be visualised as:

``````1-dimension:  array[1st_dimension]
2-dimensions: array[1st_dimension,2nd_dimension]
3-dimensions: array[1st_dimension,2nd_dimension,3rd_dimension]
``````

To access all elements of the 1st dimension (you can imagine this as the top row):

``````rand2[0,:]
``````

To access all elements of the 1st 2 dimensions (you can imagine this as the top 2 rows):

``````rand2[0:2,:]
``````

To access the first element of each dimension (you can imagine this as the 1st column):

``````rand2[:,0]
``````

To access the first 2 elements of each dimension (you can imagine this as the 2 columns):

``````rand2[:,0:2]
``````