Combining fancy and slice indexing in NumPy - Time & Space Complexity
We want to understand how the time needed changes when we combine fancy and slice indexing in numpy arrays.
How does the work grow when we pick many elements using both methods together?
Analyze the time complexity of the following code snippet.
import numpy as np
arr = np.arange(1000)
indices = [2, 5, 7, 10]
result = arr[indices[1:3]]
This code picks elements from a numpy array using a slice of a list of indices (fancy indexing combined with slicing).
Identify the loops, recursion, array traversals that repeat.
- Primary operation: Accessing elements at selected indices from the array.
- How many times: Once for each index in the slice (here 2 times for indices 5 and 7).
As the number of indices selected grows, the work grows proportionally.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | 10 element accesses |
| 100 | 100 element accesses |
| 1000 | 1000 element accesses |
Pattern observation: The time grows linearly with the number of indices selected.
Time Complexity: O(k)
This means the time grows directly with how many elements you pick using the combined indexing.
[X] Wrong: "Combining fancy and slice indexing makes the operation take time proportional to the whole array size."
[OK] Correct: Actually, numpy only accesses the elements you ask for, so time depends on how many indices you select, not the full array size.
Understanding how indexing time grows helps you write efficient data selection code and explain your choices clearly in real projects or interviews.
"What if we replaced the slice with a full list of indices? How would the time complexity change?"
Practice
arr[[0, 2], 1:4] selects:Solution
Step 1: Understand fancy indexing for rows
The fancy index[0, 2]selects rows 0 and 2 specifically.Step 2: Understand slice indexing for columns
The slice1:4selects columns starting at 1 up to but not including 4, so columns 1, 2, and 3.Final Answer:
Rows 0 and 2, columns 1 to 3 -> Option CQuick Check:
Fancy rows + slice columns = selected subarray [OK]
- Confusing rows and columns in indexing
- Forgetting slice end is exclusive
- Mixing up fancy and slice roles
arr?Solution
Step 1: Identify fancy indexing for rows
To select rows 1 and 3, use fancy indexing with a list:[1, 3].Step 2: Use slice for columns
To select columns 2 to 4, use slice2:5(end exclusive).Final Answer:
arr[[1, 3], 2:5] -> Option AQuick Check:
Fancy rows + slice columns syntax correct [OK]
- Using commas inside fancy index list
- Using slice inside list brackets
- Incorrect slice end index
import numpy as np
arr = np.array([[10, 20, 30, 40],
[50, 60, 70, 80],
[90, 100, 110, 120],
[130, 140, 150, 160]])
print(arr[[1, 3], 1:3])What is the output?
Solution
Step 1: Select rows using fancy indexing
Rows 1 and 3 are:
[50, 60, 70, 80]
[130, 140, 150, 160]Step 2: Select columns 1 to 2 (slice 1:3)
Columns 1 and 2 for these rows are:
Row 1: 60, 70
Row 3: 140, 150Final Answer:
[[ 60 70] [140 150]] -> Option BQuick Check:
Fancy rows + slice columns output matches [OK]
- Selecting wrong rows or columns
- Including column 3 by mistake
- Confusing row and column indices
import numpy as np arr = np.arange(16).reshape(4,4) result = arr[1:3, [0, 2]] print(result)
Solution
Step 1: Understand slice and fancy indexing combination
Slice1:3selects rows 1 and 2. Fancy index[0, 2]selects columns 0 and 2.Step 2: Check if code runs and output
This combination is valid in NumPy and prints the selected subarray without error.Final Answer:
It prints rows 1 and 2 with columns 0 and 2 correctly -> Option AQuick Check:
Slice rows + fancy columns works fine [OK]
- Thinking slice and fancy indexing cannot mix
- Confusing which axis uses slice or fancy
- Expecting an error when code is valid
arr. You want to select rows 0, 2, and 3, but only columns 1 to 3 inclusive. Which code correctly does this?Solution
Step 1: Identify fancy indexing for rows
Rows 0, 2, and 3 are selected using fancy indexing:[0, 2, 3].Step 2: Use slice for columns 1 to 3 inclusive
Slice1:4selects columns 1, 2, and 3 (end index exclusive).Final Answer:
arr[[0, 2, 3], 1:4] -> Option DQuick Check:
Fancy rows + slice columns selects correct subarray [OK]
- Using slice for rows instead of fancy list
- Using fancy list for columns incorrectly
- Off-by-one error in slice end index
Ready to prove it?
Pass the test and this pattern moves unknown
