Week 5: Class Exercise solutions¶
In-class exercise: array-indexing¶
Code:
print(arr_a[0])
print(arr_a[-3])
arr_a[6] = 0
arr_a[-9] = 100
print(arr_a[4:7])
arr_a[-3:] = 100
Output:
57
89
[111 115 0]
Exercise: Thinking in array indices¶
Code for Question 1:
import numpy as np
def roll_array(arr):
# YOUR CODE HERE
arr_len = len(arr)
new_arr = np.zeros(shape=(arr_len,))
new_arr[0] = arr[-1]
for i in range(1, arr_len):
new_arr[i] = arr[i-1]
return new_arr
# If your example replicates this output, it is good to go
a = np.array([2, 3, 4, 1])
roll_array(a)
# Should get output: `array([1, 2, 3, 4])
Output:
array([1., 2., 3., 4.])
Code for Question 2:
def odd_even(arr):
# YOUR CODE HERE
arr_len = len(arr)
for i in range(arr_len):
if i % 2 == 0:
arr[i] = arr[i] + 1
else:
arr[i] = arr[i] - 1
return arr
# If your example replicates this output, it is good to go
b = 5 * np.ones(shape=(6, )) # Initialize an array with all 5's
print(b)
c = odd_even(b) # Should get output: `array([6, 4, 6, 4, 6, 4])
print(c)
d = odd_even(c) # Should get output: `array([7, 3, 7, 3, 7, 3])
print(d)
Output:
[5. 5. 5. 5. 5. 5.]
[6. 4. 6. 4. 6. 4.]
[7. 3. 7. 3. 7. 3.]
Exercise: Conway’s Game of Life, but on a one-dimension grid¶
Code:
import numpy as np
# 1. Set constants N=20 and ITERATIONS=60.
N = 20
ITERATIONS = 60
# 2. Initialize a numpy array with one-dimension and length N. Set this
# array to have 1’s and 0’s at your choice. Name this array `state`.
# state = np.zeros(shape=(N, ))
state[0] = 1
state[2:8] = 1
print(state)
# 3. Initialize a blank numpy array that also has length N, but is all
# zeros. Name this array next_state.
next_state = np.zeros(shape=(N, ))
# 6. Wrap everything in steps 3 and 4 in a bigger for-loop, that loops over
# ITERATIONS. Inside this bigger for-loop, add under the previous for-loop
# the following:
# + update state by running state = next_state.copy()
# + print state
for j in range(ITERATIONS):
# 4. Create a for-loop that iterates over 2 to N-2, which corresponds
# to the cells in `state` except for the boundary cells. In each loop,
# implement the Game of Life logic above, and set the corresponding
# cell in next_state to be 1 if the cell survives, or 0 if the cell
# dies.
for i in range(2, N-2):
left_neighbours = state[i-2:i].sum()
right_neighbours = state[i+1:i+3].sum()
total_neighbours = left_neighbours + right_neighbours
# If dead cell
if state[i] == 0:
# Conditions to be alive
if (total_neighbours == 2) or (total_neighbours == 3):
next_state[i] = 1
# Else stay dead
else:
next_state[i] = 0
# If alive cell
else:
# Conditions to stay alive
if (total_neighbours == 2) or (total_neighbours == 4):
next_state[i] = 1
# Else become dead
else:
next_state[i] = 0
# 5. Implement logic that covers the boundary cells with indices 0, 1,
# N-2, and N-1. These cells follow the same rules, but don’t have the
# same number of neighbors as all other cells further from the boundary.
i = 0
# left_neighbours = state[i-2:i].sum()
left_neighbours = 0
right_neighbours = state[i+1:i+3].sum()
total_neighbours = left_neighbours + right_neighbours
if state[i] == 0:
if (total_neighbours == 2) or (total_neighbours == 3):
next_state[i] = 1
else:
if (total_neighbours != 2) or (total_neighbours != 4):
next_state[i] = 0
i = 1
# left_neighbours = state[i-2:i].sum()
left_neighbours = state[0]
right_neighbours = state[i+1:i+3].sum()
total_neighbours = left_neighbours + right_neighbours
if state[i] == 0:
if (total_neighbours == 2) or (total_neighbours == 3):
next_state[i] = 1
else:
if (total_neighbours != 2) or (total_neighbours != 4):
next_state[i] = 0
i = N-2
left_neighbours = state[i-2:i].sum()
# right_neighbours = state[i+1:i+3].sum()
right_neighbours = state[N-1]
total_neighbours = left_neighbours + right_neighbours
if state[i] == 0:
if (total_neighbours == 2) or (total_neighbours == 3):
next_state[i] = 1
else:
if (total_neighbours != 2) or (total_neighbours != 4):
next_state[i] = 0
i = N-1
left_neighbours = state[i-2:i].sum()
# right_neighbours = state[i+1:i+3].sum()
right_neighbours = 0
total_neighbours = left_neighbours + right_neighbours
if state[i] == 0:
if (total_neighbours == 2) or (total_neighbours == 3):
next_state[i] = 1
else:
if (total_neighbours != 2) or (total_neighbours != 4):
next_state[i] = 0
state = next_state.copy()
states.append(state)
print(state)