Numpy tutorial

Initalizing Arrays

In [1]:
import numpy as np
In [2]:
# Initalizing 1-D array
a1 = np.array([1, 2, 3])
print(a1)
[1 2 3]
In [4]:
# Initalizing 2-D array
a2 = np.array([[1,3,5], [2, 3, 4]])
print(a2)
[[1 3 5]
 [2 3 4]]
In [5]:
# Initalizing an array full of 0's
a3 = np.zeros(shape=(3, 2))
print(a3)
[[0. 0.]
 [0. 0.]
 [0. 0.]]
In [6]:
# Initalizing an array full of 1's
a4 = np.ones(shape=(3, 2))
print(a4)
[[1. 1.]
 [1. 1.]
 [1. 1.]]
In [7]:
# Initalizing the identity matrix
a5 = np.eye(5)
print(a5)
[[1. 0. 0. 0. 0.]
 [0. 1. 0. 0. 0.]
 [0. 0. 1. 0. 0.]
 [0. 0. 0. 1. 0.]
 [0. 0. 0. 0. 1.]]

Miscellaneous Numpy Functions

In [8]:
# Getting the dimensions of an array
print(a5.ndim)
2
In [9]:
# Getting the dimensions of an array
b = np.array([1,2,3])
print(b.ndim)
1
In [10]:
# Getting the shape of an array
# First value is # of rows.
# Second value is # of columns.
print(a5.shape)
(5, 5)
In [11]:
# Getting the shape of an array
a6 = np.array([1,2,3])
print(a6)
print(a6.shape)
[1 2 3]
(3,)
In [12]:
# Getting the shape of an array
a7 = np.array([[1], [2], [3]])
print(a7)
print(a7.shape)
[[1]
 [2]
 [3]]
(3, 1)
In [13]:
# Getting the number of elements of an array
a8 = np.array([[1, 4, 3], [2, 5, 3], [3, 9, 6]])
print(a8)
print(a8.size)
[[1 4 3]
 [2 5 3]
 [3 9 6]]
9
In [14]:
# Reshaping an array
a9 = np.array([[1, 4, 3], [2, 5, 3], [3, 9, 6],  [-1, 2, 4]])
print(a9.reshape(2, 6))
[[ 1  4  3  2  5  3]
 [ 3  9  6 -1  2  4]]
In [15]:
# vstack & hstack
a10 = np.array([1, 2, 3])
a11 = np.array([4, 5, 6])
print(np.vstack((a10, a11)))
print(np.hstack((a10, a11)))
[[1 2 3]
 [4 5 6]]
[1 2 3 4 5 6]
In [16]:
# vstack & hstack
print(np.vstack(([[1, 2, 3], [2, 3, 4]], [[6, 7, 8], [5, 2, 1]])))
print(np.hstack(([[1, 2, 3], [2, 3, 4]], [[6, 7, 8], [5, 2, 1]])))
[[1 2 3]
 [2 3 4]
 [6 7 8]
 [5 2 1]]
[[1 2 3 6 7 8]
 [2 3 4 5 2 1]]

Array Indexing and Slicing

In [17]:
a = np.array([1, 2, 3])
print(a[0], a[1], a[2])
1 2 3
In [18]:
a = np.array([[1, 2, 3]])
print(a[0], a[0][0], a[0][1], a[0][2])
print(a[0], a[0, 0], a[0, 1], a[0, 2]) # Another way of indexing
[1 2 3] 1 2 3
[1 2 3] 1 2 3
In [19]:
a = np.array([[1, 2, 3], [4, 5, 6]])
print(a[0], a[0][0], a[0][1], a[0][2])
print(a[0], a[0, 0], a[0, 1], a[0, 2]) # Another way of indexing
print(a[1], a[1][0], a[1][1], a[1][2])
print(a[1], a[1, 0], a[1, 1], a[1, 2]) # Another way of indexing
[1 2 3] 1 2 3
[1 2 3] 1 2 3
[4 5 6] 4 5 6
[4 5 6] 4 5 6
In [20]:
a = np.array([[1, 2, 3], [4, 5, 6]])
print(a[:, 0]) # Gets the first column
print(a[0, :]) # Gets the first row
[1 4]
[1 2 3]
In [21]:
a = np.array([[1, 2, 3], [4, 5, 6]])
# [0:1] Gets the first row
# 2 gets the second element
print(a[0:1, 2]) 

# [0:2] Gets both rows
# 2 gets the second element of each row
print(a[0:2, 2]) 

# [0:1] Gets the second row
# 0 gets the first element
print(a[1:2, 0]) 
[3]
[3 6]
[4]

Copying

In [22]:
'''
When you directly copy a numpy array, if you make any changes to either copy, it will also be reflected in the other one
'''
print("Example 1")
a = np.array([1,2,3])
b = a
print("Before changes a: ", a)
print("Before changes b: ", b)
b[0] = 3
print("After changes a: ", a) # Now is [3, 2, 3]
print("After changes b: ", b) 

print()
print("Example 2")
a = np.array([1,2,3])
b = a
print("Before changes a: ", a)
print("Before changes b: ", b)
a[0] = 5
print("After changes a: ", a)
print("After changes b: ", b) # Now is [5, 2, 3]
Example 1
Before changes a:  [1 2 3]
Before changes b:  [1 2 3]
After changes a:  [3 2 3]
After changes b:  [3 2 3]

Example 2
Before changes a:  [1 2 3]
Before changes b:  [1 2 3]
After changes a:  [5 2 3]
After changes b:  [5 2 3]
In [23]:
'''
Use the copy function. Changes made in one won't affect the other
'''
print("Example 1")
a = np.array([1,2,3])
b = a.copy()
print("Before changes a: ", a)
print("Before changes b: ", b)
b[0] = 3
print("After changes a: ", a) # Still [1,2,3]
print("After changes b: ", b) # Changed to [3, 2, 3]

print()
print("Example 2")
a = np.array([1,2,3])
b = a.copy()
print("Before changes a: ", a)
print("Before changes b: ", b)
a[0] = 5
print("After changes a: ", a) # Changed to [5, 2, 3]
print("After changes b: ", b) # Still [1,2,3]
Example 1
Before changes a:  [1 2 3]
Before changes b:  [1 2 3]
After changes a:  [1 2 3]
After changes b:  [3 2 3]

Example 2
Before changes a:  [1 2 3]
Before changes b:  [1 2 3]
After changes a:  [5 2 3]
After changes b:  [1 2 3]

Matrix Math

In [24]:
# Scalar Math
a = np.array([1, 2, 3])
print(a + 1)
print(a - 1)
print(a * 10)
print(a / 2)
print(a ** 2)
[2 3 4]
[0 1 2]
[10 20 30]
[0.5 1.  1.5]
[1 4 9]
In [25]:
a = np.array([1, 2, 3])
b = np.array([5, 9, 4])

# Adding 2 matrices
print(a + b)

# Subtracting 2 matrices
print(a - b)

# Element-wise multiplying 2 matrices
print(a * b)

# Element-wise dividing 2 matrices
print(a / b)

# Element-wise power
print(a ** b)
[ 6 11  7]
[-4 -7 -1]
[ 5 18 12]
[0.2        0.22222222 0.75      ]
[  1 512  81]
In [26]:
a = np.array([1, 2, 3])
b = np.array([5, 9, 4])

# Getting the transpose of a
print(a.T)

# Matrix Multiply Method 1
print(np.matmul(a, b.T))

# Matrix Multiply Method 2
print(a @ b.T)

c = np.array([[1, 2], [3, 4]])
# Getting an inverse
print(np.linalg.inv(c))
[1 2 3]
35
35
[[-2.   1. ]
 [ 1.5 -0.5]]