Contents

Python NumPy For Your Grandma - 5.3 Challenge: Population Verification

Setup

You manage a local department for the Census responsible for measuring the population of each block in the city where you live. Even though you could do it yourself, for each of the last five years, you’ve tasked this job to your subordinate, Jim. What Jim gives you each year is a 2x4 array of his population estimates where each element of the array represents a city block. After five years, you have a 5x2x4 array of population estimates called jim where (i,j,k) represents Jim’s population estimate for block (j,k) of year i.

The thing is, you don’t fully trust Jim’s estimates because you see him spending an ungodly amount of time on Facebook. So, each year, you go behind his back and measure the population of two city blocks. After five years, you have the following data:

  • blocks, a 5x2x2 array indicating which blocks you measured each year where (i,j) gives the coordinates for the jth block you measured in year i, and
  • pops, a corresponding 5x2 array with the population you measured for the jth block in year i.

How many times was Jim’s estimate at least 10% higher or lower than your estimate?

import numpy as np

generator = np.random.default_rng(2357)
jim = np.round(generator.normal(loc=100, scale=5, size=(5,2,4)))
print(jim)
## [[[106. 103.  92. 100.]
##   [ 94. 102.  94. 100.]]
## 
##  [[104.  96. 109.  96.]
##   [101. 104. 102.  92.]]
## 
##  [[102. 102. 108. 101.]
##   [ 91. 101. 106.  99.]]
## 
##  [[101.  98.  95. 102.]
##   [100. 101.  99.  93.]]
## 
##  [[107. 101. 104. 105.]
##   [102.  97. 101. 102.]]]
blocks = np.array([
    [[0,2],[1,3]],
    [[1,2],[0,0]],
    [[0,0],[1,2]],
    [[1,1],[0,3]],
    [[0,1],[1,0]]
])
pops = np.array([
    [100, 105],
    [110, 92],
    [95, 99],
    [89, 107],
    [101, 98]
])

Solution

jim_pops = jim[np.arange(5)[:, None], blocks[:, :, 0], blocks[:, :, 1]]
np.sum(np.abs(pops - jim_pops)/pops >= 0.10)
## 2

Course Curriculum

  1. Introduction
    1.1 Introduction
  2. Basic Array Stuff
    2.1 NumPy Array Motivation
    2.2 NumPy Array Basics
    2.3 Creating NumPy Arrays
    2.4 Indexing 1-D Arrays
    2.5 Indexing Multidimensional Arrays
    2.6 Basic Math On Arrays
    2.7 Challenge: High School Reunion
    2.8 Challenge: Gold Miner
    2.9 Challenge: Chic-fil-A
  3. Intermediate Array Stuff
    3.1 Broadcasting
    3.2 newaxis
    3.3 reshape()
    3.4 Boolean Indexing
    3.5 nan
    3.6 infinity
    3.7 random
    3.8 Challenge: Love Distance
    3.9 Challenge: Professor Prick
    3.10 Challenge: Psycho Parent
  4. Common Operations
    4.1 where()
    4.2 Math Functions
    4.3 all() and any()
    4.4 concatenate()
    4.5 Stacking
    4.6 Sorting
    4.7 unique()
    4.8 Challenge: Movie Ratings
    4.9 Challenge: Big Fish
    4.10 Challenge: Taco Truck
  5. Advanced Array Stuff
    5.1 Advanced Array Indexing
    5.2 View vs Copy
    5.3 Challenge: Population Verification
    5.4 Challenge: Prime Locations
    5.5 Challenge: The Game of Doors
    5.6 Challenge: Peanut Butter
  6. Final Boss
    6.1 as_strided()
    6.2 einsum()
    6.3 Challenge: One-Hot-Encoding
    6.4 Challenge: Cumulative Rainfall
    6.5 Challenge: Table Tennis
    6.6 Challenge: Where’s Waldo
    6.7 Challenge: Outer Product

Additional Content

  1. Python Pandas For Your Grandpa
  2. Neural Networks For Your Dog
  3. Introduction To Google Colab