import numpy as np
NumPy Indexing and Selection
In this lecture we will discuss how to select elements or groups of elements from an array.
#Creating sample array
= np.arange(0,11) arr
#Show
arr
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
Bracket Indexing and Selection
The simplest way to pick one or some elements of an array looks very similar to python lists:
#Get a value at an index
8] arr[
8
#Get values in a range
1:5] arr[
array([1, 2, 3, 4])
#Get values in a range
0:5] arr[
array([0, 1, 2, 3, 4])
Broadcasting
NumPy arrays differ from normal Python lists because of their ability to broadcast. With lists, you can only reassign parts of a list with new parts of the same size and shape. That is, if you wanted to replace the first 5 elements in a list with a new value, you would have to pass in a new 5 element list. With NumPy arrays, you can broadcast a single value across a larger set of values:
#Setting a value with index range (Broadcasting)
0:5]=100
arr[
#Show
arr
array([100, 100, 100, 100, 100, 5, 6, 7, 8, 9, 10])
# Reset array, we'll see why I had to reset in a moment
= np.arange(0,11)
arr
#Show
arr
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
#Important notes on Slices
= arr[0:6]
slice_of_arr
#Show slice
slice_of_arr
array([0, 1, 2, 3, 4, 5])
#Change Slice
=99
slice_of_arr[:]
#Show Slice again
slice_of_arr
array([99, 99, 99, 99, 99, 99])
Now note the changes also occur in our original array!
arr
array([99, 99, 99, 99, 99, 99, 6, 7, 8, 9, 10])
Data is not copied, it’s a view of the original array! This avoids memory problems!
#To get a copy, need to be explicit
= arr.copy()
arr_copy
arr_copy
array([99, 99, 99, 99, 99, 99, 6, 7, 8, 9, 10])
Indexing a 2D array (matrices)
The general format is arr_2d[row][col] or arr_2d[row,col]. I recommend using the comma notation for clarity.
= np.array(([5,10,15],[20,25,30],[35,40,45]))
arr_2d
#Show
arr_2d
array([[ 5, 10, 15],
[20, 25, 30],
[35, 40, 45]])
#Indexing row
1] arr_2d[
array([20, 25, 30])
# Format is arr_2d[row][col] or arr_2d[row,col]
# Getting individual element value
1][0] arr_2d[
20
# Getting individual element value
1,0] arr_2d[
20
# 2D array slicing
#Shape (2,2) from top right corner
2,1:] arr_2d[:
array([[10, 15],
[25, 30]])
#Shape bottom row
2] arr_2d[
array([35, 40, 45])
#Shape bottom row
2,:] arr_2d[
array([35, 40, 45])
More Indexing Help
Indexing a 2D matrix can be a bit confusing at first, especially when you start to add in step size. Try google image searching NumPy indexing to find useful images, like this one:
Image source: http://www.scipy-lectures.org/intro/numpy/numpy.html
Conditional Selection
This is a very fundamental concept that will directly translate to pandas later on, make sure you understand this part!
Let’s briefly go over how to use brackets for selection based off of comparison operators.
= np.arange(1,11)
arr arr
array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
> 4 arr
array([False, False, False, False, True, True, True, True, True,
True])
= arr>4 bool_arr
bool_arr
array([False, False, False, False, True, True, True, True, True,
True])
arr[bool_arr]
array([ 5, 6, 7, 8, 9, 10])
>2] arr[arr
array([ 3, 4, 5, 6, 7, 8, 9, 10])
= 2
x >x] arr[arr
array([ 3, 4, 5, 6, 7, 8, 9, 10])