## Introduction

Similar to Python lists, we can can also use access NumPy subarrays with the slice notation with the aid of the colon (:) character. The NumPy slicing syntax follows that of the standard Python list.

We begin this section by first importing the NumPy package and creating 3 random arrays using the numpy.random.choice function and seeding the PRNG so that results are reproducible by the reader.

Example

A 1-D random array.

1import numpy as np
2R = np.random.RandomState(32) #set a random seed
3a1 = R.choice(10, size=10, replace=False)
4print(a1)

[9 1 2 8 3 0 4 6 5 7]


Example

A 2-D random array.

1a2 = R.choice(3*4, size=(3,4), replace=False)
2print(a2)

[[ 8 10  0  2]
[ 6  7  1 11]
[ 4  9  5  3]]


Example

A 3-D random array.

1a3 = R.choice(3*4*5, size=(3,4,5), replace=False)
2print(a3)

[[[21  8  7 25  1]
[53 31 23 44 12]
[ 3 54 37 51 42]
[45 14 22 27 34]]

[[28 57 52 40 17]
[32  9  2 59 39]
[33 15 46 43 24]
[35 58 19 16 41]]

[[ 4 30  6 49  0]
[48 47 29 26 56]
[11 13 38  5 55]
[36 50 20 10 18]]]


The above random arrays are the same as those used in the previous section on Array Indexing.

## Slicing of 1-D Arrays

The NumPy array slicing syntax follows that of the standard Python list.

Syntax

Slicing a 1-D array.

1array[start=0:stop=size of array:step=1]

Parameter Required? Default Value Description
start ❌ No 0 An integer number specifying at which position to start the slicing.
stop ❌ No Size of array. An integer number specifying at which position to end the slicing (output excludes endpoint).
step ❌ No 1 An integer number specifying the step of the slicing.

Python and NumPy both use half-open intervals: the start index is included while the stop index is not.

Example

Printing a 1-D array. The following are all equivalent.

1print(a1[0:a1.size:1])  # 10 is the size
2print(a1[::])
3print(a1[:])
4print(a1)

[9 1 2 8 3 0 4 6 5 7]
[9 1 2 8 3 0 4 6 5 7]
[9 1 2 8 3 0 4 6 5 7]
[9 1 2 8 3 0 4 6 5 7]


We see that the same a1 array is printed whether one colon (:) or two colons (::) are enclosed within the square brackets (with no numbers specified).

### Slicing with Positive Indices

The following shows the positive index of each element of the 1-D array a1.

 Positive Index Element 0 1 2 3 4 5 6 7 8 9 9 1 2 8 3 0 4 6 5 7

Example

Slicing a 1-D array (positive indices).

1a1[5:] # all elements after index 5

array([0, 4, 6, 5, 7])


Example

Slicing a 1-D array (positive indices).

1a1[4:7] # subarray

array([3, 0, 4])


Example

Slicing a 1-D array (positive indices).

1a1[::3] # # step size of 3

array([9, 8, 4, 7])


Example

Slicing a 1-D array (positive indices).

1a1[:7:2] # every other element, stop at index=7

array([9, 2, 3, 4])


Example

Slicing a 1-D array (positive indices).

1a1[3::2] # every other element, starting at index 3

array([8, 0, 6, 7])


### Slicing with Mixed Indices

Mixed indices refer to a combination of both positive and negative indices. The following shows the negative index of each element of the 1-D array a1. The last element has an index of -1, the second last element has an index of -2 and so on.

 Negative Index Element -10 -9 -8 -7 -6 -5 -4 -3 -2 -1 9 1 2 8 3 0 4 6 5 7

Example

Slicing a 1-D array (mixed indices).

1a1[::-1] # all elements, reversed.

array([7, 5, 6, 4, 0, 3, 8, 2, 1, 9])


Example

Slicing a 1-D array (mixed indices).

1a1[5:1:-1] # reversed  from index 5 to index 2

array([0, 3, 8, 2])

 Positive Index Element 0 1 2 3 4 5 6 7 8 9 9 1 2 8 3 0 4 6 5 7

Example

Slicing a 1-D array (mixed indices).

1a1[-3:-8:-2] # reversed (every other) from index -3 to index -7

array([6, 0, 8])

 Negative Index Element -10 -9 -8 -7 -6 -5 -4 -3 -2 -1 9 1 2 8 3 0 4 6 5 7

## Slicing of 2-D Arrays.

Syntax

Slicing of 2-D arrays.

1array[start=0:stop=n1:step=1, start=0:stop=n2:step=1]


where n1 is the size of the first dimension (number of rows) and n2 is the size of the second dimension (number of columns).

Parameter Required? Default Value Description
start ❌ No 0 An integer number specifying at which position to start the slicing.
stop ❌ No Size of dimension. An integer number specifying at which position to end the slicing (output excludes endpoint).
step ❌ No 1 An integer number specifying the step of the slicing.

Example

Printing a 2-D array. The following are all equivalent.

1print(a2[0:a2.shape:1,0:a2.shape:1])
2print(a2[:,:])
3print(a2[::,::])
4print(a2[0:a2.shape:1,:])
5print(a2)

[[ 8 10  0  2]
[ 6  7  1 11]
[ 4  9  5  3]]

[[ 8 10  0  2]
[ 6  7  1 11]
[ 4  9  5  3]]

[[ 8 10  0  2]
[ 6  7  1 11]
[ 4  9  5  3]]

[[ 8 10  0  2]
[ 6  7  1 11]
[ 4  9  5  3]]

[[ 8 10  0  2]
[ 6  7  1 11]
[ 4  9  5  3]]


In a 2-D NumPy array, we can access elements using a comma-separated tuple of 2 indices: (row index, column index). For example, for the a2 array, the first index (red) represents the row index (top to bottom) and second index (blue) represents the column index (left to right). Example

Slicing a 2-D array.

1a2[:2, :] # 1st two rows

array([[ 8, 10,  0,  2],
[ 6,  7,  1, 11]])


Example

Slicing a 2-D array.

1a2[: , :3] # 1st 3 colummns

array([[ 8, 10,  0],
[ 6,  7,  1],
[ 4,  9,  5]])


Example

Slicing a 2-D array.

1a2[:2, :3] # 1st two rows, 1st three columns

array([[ 8, 10,  0],
[ 6,  7,  1]])


Example

Slicing a 2-D array (every other row).

1a2[::2 , :] # every other row

array([[ 8, 10,  0,  2],
[ 4,  9,  5,  3]]) Since row access is quite common in NumPy, there is a shortcut to slicing rows. We can simply insert an array of row indices within the square brackets.

Example

Slicing a 2-D array (every other row).

1a2[[0,2]] # every other row

array([[ 8, 10,  0,  2],
[ 4,  9,  5,  3]])

Tip

To access the rows of a 2-D array, we can simply insert an array of row indices within the square brackets: a2[row_indices].

Alternatively, the following code works as well.

Example

Slicing a 2-D array (every other row).

1a2[np.arange(3)[::2]] # every other row

array([[ 8, 10,  0,  2],
[ 4,  9,  5,  3]])


Example

Slicing a 2-D array.

1a2[1:, 1:3] #subarray

array([[7, 1],
[9, 5]]) Example

Reversing rows of a 2-D array.

1a2[::-1 , :] # rows reversed

array([[ 4,  9,  5,  3],
[ 6,  7,  1, 11],
[ 8, 10,  0,  2]])


Example

Reversing columns of a 2-D array.

1a2[: , ::-1] # columns reversed

array([[ 2,  0, 10,  8],
[11,  1,  7,  6],
[ 3,  5,  9,  4]])


## Slicing of 3-D Arrays.

Syntax

Slicing of 3-D arrays.

1array[start=0:stop=n1:step=1, start=0:stop=n2:step=1, start=0:stop=n3:step=1]

Parameter Required? Default Value Description
start ❌ No 0 An integer number specifying at which position to start the slicing.
stop ❌ No Size of dimension. An integer number specifying at which position to end the slicing (output excludes endpoint).
step ❌ No 1 An integer number specifying the step of the slicing.

where the stop index is given by:

stop index Code Description
n1 numpy.ndarray.shape Number of frames.
n2 numpy.ndarray.shape Number of rows.
n3 numpy.ndarray.shape Number of columns.

In a 3-D NumPy array, we can access elements using a comma-separated tuple of 3 indices: (frame index, row index, column index). For example, for the a3 array, the first index (green) indicates the frame index, the second index (red) represents the row index (top to bottom) and third index (blue) represents the column index (left to right). The ouput is typically printed frame by frame. Example

Printing a 3-D array. The following are all equivalent.

1print(a3[0:a3.shape:1, 0:a3.shape:1, 0:a3.shape:1])
2print(a3[:,:,:])
3print(a3[::,::,::])
4print(a3[0:a3.shape:1,:,:])
5print(a3[0:a3.shape:1,0:a3.shape:1,:])
6print(a3[:,0:a3.shape:1,:])
7print(a3[:,:,0:a3.shape:1])
8print(a3)

[[[21  8  7 25  1]
[53 31 23 44 12]
[ 3 54 37 51 42]
[45 14 22 27 34]]

[[28 57 52 40 17]
[32  9  2 59 39]
[33 15 46 43 24]
[35 58 19 16 41]]

[[ 4 30  6 49  0]
[48 47 29 26 56]
[11 13 38  5 55]
[36 50 20 10 18]]]


Note that the above list is not exhaustive. Other configurations are possible.

Example

Slicing a 3-D array.

1a3[1,:,:] # second frame

array([[28, 57, 52, 40, 17],
[32,  9,  2, 59, 39],
[33, 15, 46, 43, 24],
[35, 58, 19, 16, 41]]) Example

Slicing a 3-D array.

1a3[:,2,:] # third row

array([[ 3, 54, 37, 51, 42],
[33, 15, 46, 43, 24],
[11, 13, 38,  5, 55]]) Example

Slicing a 3-D array.

1a3[:,:,3]   # 4th column

array([[25, 44, 51, 27],
[40, 59, 43, 16],
[49, 26,  5, 10]]) Example

Slicing a 3-D array.

1a3[1:,1:3,::2] # subarray

array([[[32,  2, 39],
[33, 46, 24]],

[[48, 29, 56],
[11, 38, 55]]]) 