Contents

Python NumPy For Your Grandma - 6.6 Challenge: Where's Waldo

Setup

Given a 1-million element array where each element is a random character in a-z, identify the starting index of every sequence of characters that spells ‘waldo’.

Twist: include sequences where 4 of the 5 characters match. (e.g. ‘wafdo’ and ‘xaldo’ but not ‘wadlo’)

import numpy as np
import string

generator = np.random.default_rng(123)
chars = generator.choice(list(string.ascii_lowercase), size=10**6, replace=True)
print(chars[:10])
## ['a' 'r' 'p' 'b' 'x' 'f' 'g' 'e' 'i' 'e']

Solution

windows = np.lib.stride_tricks.as_strided(
    x = chars,
    shape = (len(chars) - (5-1), 5),
    strides = (chars.strides[0], chars.strides[0])
)
waldo = np.array(['w','a','l','d','o'], dtype='<U1')
start_idxs = np.where((windows == waldo).sum(axis=1) >= 4)[0]
print(start_idxs)
## [ 15063 142002 154213 177190 330101 335422 348645 415541 447457 505677
##  669313 673093 726243 879558 946156]
# Check
for idx in start_idxs:
    print(''.join(chars[idx:(idx + 5)]))
## waldl
## walio
## walfo
## waudo
## walmo
## wardo
## wtldo
## faldo
## zaldo
## wpldo
## waldd
## wxldo
## qaldo
## wakdo
## kaldo

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