Reductions
Min, Max, and Argmax
Find the minimum, maximum, and the index of the maximum in a single pass over
a 6-element list. Two if-checks per iteration update the running extremes.
The trace shows min_val, max_val, and max_idx updating only when a new
extreme is found.
By hand
Initialize min_val, max_val, and max_idx from the first element. Loop
over each index i: if values[i] is smaller than min_val, update it; if
larger than max_val, update both max_val and max_idx.
naive.py
Replay: real traced execution (multi-file project)
values = [3, 7, 2, 9, 1, 5]
min_val = values[0]
max_val = values[0]
max_idx = 0
for i in range(len(values)):
if values[i] < min_val:
min_val = values[i]
if values[i] > max_val:
max_val = values[i]
max_idx = i
print('RESULT:', (min_val, max_val, max_idx))
values ← [3, 7, 2, 9, 1, 5]
1values = [3, 7, 2, 9, 1, 5]2min_val = values[0]values this step[3, 7, 2, 9, 1, 5]valuesmin_val ← 3
1values = [3, 7, 2, 9, 1, 5]2min_val = values[0]3max_val = values[0]values this step3min_valmax_val ← 3
2min_val = values[0]3max_val = values[0]4max_idx = 0values this step3max_valmax_idx ← 0
3max_val = values[0]4max_idx = 05for i in range(len(values)):values this step0max_idxi ← 0
4max_idx = 05for i in range(len(values)):6 if values[i] < min_val:values this step0iif values[i] < min_val:
5for i in range(len(values)):6 if values[i] < min_val:7 min_val = values[i]if values[i] > max_val:
7 min_val = values[i]8if values[i] > max_val:9 max_val = values[i]i ← 1
4max_idx = 05for i in range(len(values)):6 if values[i] < min_val:values this step0 → 1iif values[i] < min_val:
5for i in range(len(values)):6 if values[i] < min_val:7 min_val = values[i]if values[i] > max_val:
7 min_val = values[i]8if values[i] > max_val:9 max_val = values[i]max_val ← 7
8if values[i] > max_val:9 max_val = values[i]10 max_idx = ivalues this step3 → 7max_valmax_idx ← 1
9 max_val = values[i]10 max_idx = i11print('RESULT:', (min_val, max_val, max_idx))values this step0 → 1max_idxi ← 2
4max_idx = 05for i in range(len(values)):6 if values[i] < min_val:values this step1 → 2iif values[i] < min_val:
5for i in range(len(values)):6 if values[i] < min_val:7 min_val = values[i]min_val ← 2
6if values[i] < min_val:7 min_val = values[i]8if values[i] > max_val:values this step3 → 2min_valif values[i] > max_val:
7 min_val = values[i]8if values[i] > max_val:9 max_val = values[i]i ← 3
4max_idx = 05for i in range(len(values)):6 if values[i] < min_val:values this step2 → 3iif values[i] < min_val:
5for i in range(len(values)):6 if values[i] < min_val:7 min_val = values[i]if values[i] > max_val:
7 min_val = values[i]8if values[i] > max_val:9 max_val = values[i]max_val ← 9
8if values[i] > max_val:9 max_val = values[i]10 max_idx = ivalues this step7 → 9max_valmax_idx ← 3
9 max_val = values[i]10 max_idx = i11print('RESULT:', (min_val, max_val, max_idx))values this step1 → 3max_idxi ← 4
4max_idx = 05for i in range(len(values)):6 if values[i] < min_val:values this step3 → 4iif values[i] < min_val:
5for i in range(len(values)):6 if values[i] < min_val:7 min_val = values[i]min_val ← 1
6if values[i] < min_val:7 min_val = values[i]8if values[i] > max_val:values this step2 → 1min_valif values[i] > max_val:
7 min_val = values[i]8if values[i] > max_val:9 max_val = values[i]i ← 5
4max_idx = 05for i in range(len(values)):6 if values[i] < min_val:values this step4 → 5iif values[i] < min_val:
5for i in range(len(values)):6 if values[i] < min_val:7 min_val = values[i]if values[i] > max_val:
7 min_val = values[i]8if values[i] > max_val:9 max_val = values[i]for i in range(len(values)):
4max_idx = 05for i in range(len(values)):6 if values[i] < min_val:stdout ← RESULT: (1, 9, 3)
10 max_idx = i11print('RESULT:', (min_val, max_val, max_idx))values this stepRESULT: (1, 9, 3)stdout
With NumPy
a.min() and a.max() return the extreme values; a.argmax() returns the
integer index of the first occurrence of the maximum. The snapshot shows the
input array followed by all three results on one line.
library.py
import numpy as np
values = [3, 7, 2, 9, 1, 5]
a = np.array(values)
mn = int(a.min())
mx = int(a.max())
idx = int(a.argmax())
print('shape:', a.shape)
print('dtype:', a.dtype)
print('values:', a.tolist())
print('min:', mn, 'max:', mx, 'argmax:', idx)
print('RESULT:', (mn, mx, idx))
shape: (6,)
dtype: int64
values: [3, 7, 2, 9, 1, 5]
min: 1 max: 9 argmax: 3
RESULT: (1, 9, 3)
Implementation notes
argmaxreturns the index of the first maximum. If the maximum value appears more than once,argmaxreturns the lowest index — the same behaviour as the hand-written loop here, which only updatesmax_idxon a strict>comparison.a.argmin()works the same way for the minimum.- All three —
min,max,argmax— are reductions: they collapse the array to a scalar (or an index). Called without anaxisargument they operate over the entire array. int()converts the NumPy scalar return values to plain Python ints forRESULT, avoiding repr differences across NumPy versions.- Shape, dtype, and values are shown explicitly here because
ndarray.__repr__output varies with NumPy version and print options.