From eb18f246aee338b2a6169ba18d8c5ced7cf89f53 Mon Sep 17 00:00:00 2001 From: Ed Bennett Date: Thu, 23 Apr 2026 14:10:14 +0100 Subject: [PATCH 1/2] replace all instances of numpy.amax and numpy.amin with numpy.max and numpy.min per discussion on #1117 --- episodes/02-numpy.md | 38 +- episodes/03-matplotlib.md | 22 +- episodes/06-files.md | 8 +- episodes/07-cond.md | 18 +- episodes/08-func.md | 22 +- episodes/10-defensive.md | 2 +- episodes/12-cmdline.md | 24 +- episodes/fig/generate_figures.py | 12 +- .../fig/python-operations-across-axes.odg | Bin 16221 -> 0 bytes .../fig/python-operations-across-axes.png | Bin 48383 -> 0 bytes .../fig/python-operations-across-axes.svg | 394 ++++++++++++++++++ episodes/files/code/readings_04.py | 4 +- episodes/files/code/readings_05.py | 4 +- episodes/files/code/readings_06.py | 4 +- episodes/files/code/readings_07.py | 4 +- episodes/files/code/readings_08.py | 4 +- episodes/files/code/readings_09.py | 4 +- learners/discuss.md | 2 +- 18 files changed, 474 insertions(+), 92 deletions(-) delete mode 100644 episodes/fig/python-operations-across-axes.odg delete mode 100644 episodes/fig/python-operations-across-axes.png create mode 100644 episodes/fig/python-operations-across-axes.svg diff --git a/episodes/02-numpy.md b/episodes/02-numpy.md index f281834b79..8ff0011b4f 100644 --- a/episodes/02-numpy.md +++ b/episodes/02-numpy.md @@ -340,15 +340,15 @@ We'll also use multiple assignment, a convenient Python feature that will enable us to do this all in one line. ```python -maxval, minval, stdval = numpy.amax(data), numpy.amin(data), numpy.std(data) +maxval, minval, stdval = numpy.max(data), numpy.min(data), numpy.std(data) print('maximum inflammation:', maxval) print('minimum inflammation:', minval) print('standard deviation:', stdval) ``` -Here we've assigned the return value from `numpy.amax(data)` to the variable `maxval`, the value -from `numpy.amin(data)` to `minval`, and so on. +Here we've assigned the return value from `numpy.max(data)` to the variable `maxval`, the value +from `numpy.min(data)` to `minval`, and so on. ```output maximum inflammation: 20.0 @@ -374,18 +374,6 @@ and press the Tab key twice for a listing of what is available. You c for example: `help(numpy.cumprod)`. -:::::::::::::::::::::::::::::::::::::::::::::::::: - -::::::::::::::::::::::::::::::::::::::::: callout - -## Confusing Function Names - -One might wonder why the functions are called `amax` and `amin` and not `max` and `min` or why the other is called `mean` and not `amean`. -The package `numpy` does provide functions `max` and `min` that are fully equivalent to `amax` and `amin`, but they share a name with standard library functions `max` and `min` that come with Python itself. -Referring to the functions like we did above, that is `numpy.max` for example, does not cause problems, but there are other ways to refer to them that could. -In addition, text editors might highlight (color) these functions like standard library function, even though they belong to NumPy, which can be confusing and lead to errors. -Since there is no function called `mean` in the standard library, there is no function called `amean`. - :::::::::::::::::::::::::::::::::::::::::::::::::: When analyzing data, though, @@ -397,7 +385,7 @@ then ask it to do the calculation: ```python patient_0 = data[0, :] # 0 on the first axis (rows), everything on the second (columns) -print('maximum inflammation for patient 0:', numpy.amax(patient_0)) +print('maximum inflammation for patient 0:', numpy.max(patient_0)) ``` ```output @@ -408,7 +396,7 @@ We don't actually need to store the row in a variable of its own. Instead, we can combine the selection and the function call: ```python -print('maximum inflammation for patient 2:', numpy.amax(data[2, :])) +print('maximum inflammation for patient 2:', numpy.max(data[2, :])) ``` ```output @@ -420,11 +408,11 @@ next diagram on the left) or the average for each day (as in the diagram on the right)? As the diagram below shows, we want to perform the operation across an axis: -![](fig/python-operations-across-axes.png){alt="Per-patient maximum inflammation is computed row-wise across all columns usingnumpy.amax(data, axis=1). Per-day average inflammation is computed column-wise across all rows usingnumpy.mean(data, axis=0)."} +![](fig/python-operations-across-axes.svg){alt="Per-patient maximum inflammation is computed row-wise across all columns usingnumpy.max(data, axis=1). Per-day average inflammation is computed column-wise across all rows usingnumpy.mean(data, axis=0)."} -To find the **maximum inflammation reported for each patient**, you would apply the `max` function moving across the columns (axis 1). To find the **daily average inflammation reported across patients**, you would apply the `mean` function moving down the rows (axis 0). +To find the **maximum inflammation reported for each patient**, you would apply the `max` function moving across the columns (axis 1). To find the **daily average inflammation reported across patients**, you would apply the `mean` function moving down the rows (axis 0). -To support this functionality, most array functions allow us to specify the axis we want to work on. If we ask for the max across axis 1 (columns in our 2D example), we get: +To support this functionality, most array functions allow us to specify the axis we want to work on. If we ask for the maximum across axis 1 (columns in our 2D example), we get: ```python print(numpy.max(data, axis=1)) @@ -437,7 +425,7 @@ print(numpy.max(data, axis=1)) 17. 16. 17. 19. 18. 18.] ``` -As a quick check, we can ask this array what its shape is. We expect 60 patient maximums: +As a quick check, we can ask this array what its shape is. We expect 60 patient maxima: ```python print(numpy.max(data, axis=1).shape) @@ -779,11 +767,11 @@ it matter if the change in inflammation is an increase or a decrease? ## Solution -By using the `numpy.amax()` function after you apply the `numpy.diff()` +By using the `numpy.max()` function after you apply the `numpy.diff()` function, you will get the largest difference between days. ```python -numpy.amax(numpy.diff(data, axis=1), axis=1) +numpy.max(numpy.diff(data, axis=1), axis=1) ``` ```python @@ -804,7 +792,7 @@ Notice the difference if you get the largest *absolute* difference between readings. ```python -numpy.amax(numpy.absolute(numpy.diff(data, axis=1)), axis=1) +numpy.max(numpy.absolute(numpy.diff(data, axis=1)), axis=1) ``` ```python @@ -831,7 +819,7 @@ array([ 12., 14., 11., 13., 11., 13., 10., 12., 10., 10., 10., - Array indices start at 0, not 1. - Use `low:high` to specify a `slice` that includes the indices from `low` to `high-1`. - Use `# some kind of explanation` to add comments to programs. -- Use `numpy.mean(array)`, `numpy.amax(array)`, and `numpy.amin(array)` to calculate simple statistics. +- Use `numpy.mean(array)`, `numpy.max(array)`, and `numpy.min(array)` to calculate simple statistics. - Use `numpy.mean(array, axis=0)` or `numpy.mean(array, axis=1)` to calculate statistics across the specified axis. :::::::::::::::::::::::::::::::::::::::::::::::::: diff --git a/episodes/03-matplotlib.md b/episodes/03-matplotlib.md index af0e5faa07..4ab1c432b2 100644 --- a/episodes/03-matplotlib.md +++ b/episodes/03-matplotlib.md @@ -79,14 +79,14 @@ the medication takes 3 weeks to take effect. But a good data scientist doesn't average of a dataset, so let's have a look at two other statistics: ```python -max_plot = matplotlib.pyplot.plot(numpy.amax(data, axis=0)) +max_plot = matplotlib.pyplot.plot(numpy.max(data, axis=0)) matplotlib.pyplot.show() ``` ![](fig/inflammation-01-maximum.svg){alt='A line graph showing the maximum inflammation across all patients over a 40-day period.'} ```python -min_plot = matplotlib.pyplot.plot(numpy.amin(data, axis=0)) +min_plot = matplotlib.pyplot.plot(numpy.min(data, axis=0)) matplotlib.pyplot.show() ``` @@ -127,10 +127,10 @@ axes1.set_ylabel('average') axes1.plot(numpy.mean(data, axis=0)) axes2.set_ylabel('max') -axes2.plot(numpy.amax(data, axis=0)) +axes2.plot(numpy.max(data, axis=0)) axes3.set_ylabel('min') -axes3.plot(numpy.amin(data, axis=0)) +axes3.plot(numpy.min(data, axis=0)) fig.tight_layout() @@ -215,7 +215,7 @@ Update your plotting code to automatically set a more appropriate scale. ```python # One method axes3.set_ylabel('min') -axes3.plot(numpy.amin(data, axis=0)) +axes3.plot(numpy.min(data, axis=0)) axes3.set_ylim(0, 6) ``` @@ -227,10 +227,10 @@ axes3.set_ylim(0, 6) ```python # A more automated approach -min_data = numpy.amin(data, axis=0) +min_data = numpy.min(data, axis=0) axes3.set_ylabel('min') axes3.plot(min_data) -axes3.set_ylim(numpy.amin(min_data), numpy.amax(min_data) * 1.1) +axes3.set_ylim(numpy.min(min_data), numpy.max(min_data) * 1.1) ``` ::::::::::::::::::::::::: @@ -269,10 +269,10 @@ axes1.set_ylabel('average') axes1.plot(numpy.mean(data, axis=0), drawstyle='steps-mid') axes2.set_ylabel('max') -axes2.plot(numpy.amax(data, axis=0), drawstyle='steps-mid') +axes2.plot(numpy.max(data, axis=0), drawstyle='steps-mid') axes3.set_ylabel('min') -axes3.plot(numpy.amin(data, axis=0), drawstyle='steps-mid') +axes3.plot(numpy.min(data, axis=0), drawstyle='steps-mid') fig.tight_layout() @@ -336,10 +336,10 @@ axes1.set_ylabel('average') axes1.plot(numpy.mean(data, axis=0)) axes2.set_ylabel('max') -axes2.plot(numpy.amax(data, axis=0)) +axes2.plot(numpy.max(data, axis=0)) axes3.set_ylabel('min') -axes3.plot(numpy.amin(data, axis=0)) +axes3.plot(numpy.min(data, axis=0)) fig.tight_layout() diff --git a/episodes/06-files.md b/episodes/06-files.md index e3330943f0..0ba85f6820 100644 --- a/episodes/06-files.md +++ b/episodes/06-files.md @@ -74,10 +74,10 @@ for filename in filenames: axes1.plot(numpy.mean(data, axis=0)) axes2.set_ylabel('max') - axes2.plot(numpy.amax(data, axis=0)) + axes2.plot(numpy.max(data, axis=0)) axes3.set_ylabel('min') - axes3.plot(numpy.amin(data, axis=0)) + axes3.plot(numpy.min(data, axis=0)) fig.tight_layout() matplotlib.pyplot.show() @@ -199,10 +199,10 @@ axes1.set_ylabel('average') axes1.plot(numpy.mean(composite_data, axis=0)) axes2.set_ylabel('max') -axes2.plot(numpy.amax(composite_data, axis=0)) +axes2.plot(numpy.max(composite_data, axis=0)) axes3.set_ylabel('min') -axes3.plot(numpy.amin(composite_data, axis=0)) +axes3.plot(numpy.min(composite_data, axis=0)) fig.tight_layout() diff --git a/episodes/07-cond.md b/episodes/07-cond.md index 8f46e15714..dd0f44fa0d 100644 --- a/episodes/07-cond.md +++ b/episodes/07-cond.md @@ -174,8 +174,8 @@ if maximum inflammation in the beginning (day 0) and in the middle (day 20) of the study are equal to the corresponding day numbers. ```python -max_inflammation_0 = numpy.amax(data, axis=0)[0] -max_inflammation_20 = numpy.amax(data, axis=0)[20] +max_inflammation_0 = numpy.max(data, axis=0)[0] +max_inflammation_20 = numpy.max(data, axis=0)[20] if max_inflammation_0 == 0 and max_inflammation_20 == 20: print('Suspicious looking maxima!') @@ -186,7 +186,7 @@ the minima per day were all zero (looks like a healthy person snuck into our stu We can also check for this with an `elif` condition: ```python -elif numpy.sum(numpy.amin(data, axis=0)) == 0: +elif numpy.sum(numpy.min(data, axis=0)) == 0: print('Minima add up to zero!') ``` @@ -202,12 +202,12 @@ Let's test that out: ```python data = numpy.loadtxt(fname='inflammation-01.csv', delimiter=',') -max_inflammation_0 = numpy.amax(data, axis=0)[0] -max_inflammation_20 = numpy.amax(data, axis=0)[20] +max_inflammation_0 = numpy.max(data, axis=0)[0] +max_inflammation_20 = numpy.max(data, axis=0)[20] if max_inflammation_0 == 0 and max_inflammation_20 == 20: print('Suspicious looking maxima!') -elif numpy.sum(numpy.amin(data, axis=0)) == 0: +elif numpy.sum(numpy.min(data, axis=0)) == 0: print('Minima add up to zero!') else: print('Seems OK!') @@ -220,12 +220,12 @@ Suspicious looking maxima! ```python data = numpy.loadtxt(fname='inflammation-03.csv', delimiter=',') -max_inflammation_0 = numpy.amax(data, axis=0)[0] -max_inflammation_20 = numpy.amax(data, axis=0)[20] +max_inflammation_0 = numpy.max(data, axis=0)[0] +max_inflammation_20 = numpy.max(data, axis=0)[20] if max_inflammation_0 == 0 and max_inflammation_20 == 20: print('Suspicious looking maxima!') -elif numpy.sum(numpy.amin(data, axis=0)) == 0: +elif numpy.sum(numpy.min(data, axis=0)) == 0: print('Minima add up to zero!') else: print('Seems OK!') diff --git a/episodes/08-func.md b/episodes/08-func.md index cbbd4353d5..7a5dc2f82d 100644 --- a/episodes/08-func.md +++ b/episodes/08-func.md @@ -217,10 +217,10 @@ def visualize(filename): axes1.plot(numpy.mean(data, axis=0)) axes2.set_ylabel('max') - axes2.plot(numpy.amax(data, axis=0)) + axes2.plot(numpy.max(data, axis=0)) axes3.set_ylabel('min') - axes3.plot(numpy.amin(data, axis=0)) + axes3.plot(numpy.min(data, axis=0)) fig.tight_layout() matplotlib.pyplot.show() @@ -234,9 +234,9 @@ def detect_problems(filename): data = numpy.loadtxt(fname=filename, delimiter=',') - if numpy.amax(data, axis=0)[0] == 0 and numpy.amax(data, axis=0)[20] == 20: + if numpy.max(data, axis=0)[0] == 0 and numpy.max(data, axis=0)[20] == 20: print('Suspicious looking maxima!') - elif numpy.sum(numpy.amin(data, axis=0)) == 0: + elif numpy.sum(numpy.min(data, axis=0)) == 0: print('Minima add up to zero!') else: print('Seems OK!') @@ -317,12 +317,12 @@ It's hard to tell from the default output whether the result is correct, but there are a few tests that we can run to reassure us: ```python -print('original min, mean, and max are:', numpy.amin(data), numpy.mean(data), numpy.amax(data)) +print('original min, mean, and max are:', numpy.min(data), numpy.mean(data), numpy.max(data)) offset_data = offset_mean(data, 0) print('min, mean, and max of offset data are:', - numpy.amin(offset_data), + numpy.min(offset_data), numpy.mean(offset_data), - numpy.amax(offset_data)) + numpy.max(offset_data)) ``` ```output @@ -779,8 +779,8 @@ then the replacement for a value `v` should be `(v-L) / (H-L)`.) ```python def rescale(input_array): - L = numpy.amin(input_array) - H = numpy.amax(input_array) + L = numpy.min(input_array) + H = numpy.max(input_array) output_array = (input_array - L) / (H - L) return output_array ``` @@ -836,8 +836,8 @@ do the two functions always behave the same way? ```python def rescale(input_array, low_val=0.0, high_val=1.0): """rescales input array values to lie between low_val and high_val""" - L = numpy.amin(input_array) - H = numpy.amax(input_array) + L = numpy.min(input_array) + H = numpy.max(input_array) intermed_array = (input_array - L) / (H - L) output_array = intermed_array * (high_val - low_val) + low_val return output_array diff --git a/episodes/10-defensive.md b/episodes/10-defensive.md index 3e13d44c8d..897fd5ac13 100644 --- a/episodes/10-defensive.md +++ b/episodes/10-defensive.md @@ -527,7 +527,7 @@ can you think of a function that will pass your tests but not his/hers or vice v # a possible pre-condition: assert len(input_array) > 0, 'Array length must be non-zero' # a possible post-condition: -assert numpy.amin(input_array) <= average <= numpy.amax(input_array), +assert numpy.min(input_array) <= average <= numpy.max(input_array), 'Average should be between min and max of input values (inclusive)' ``` diff --git a/episodes/12-cmdline.md b/episodes/12-cmdline.md index 9779c98495..4c7ee70b3d 100644 --- a/episodes/12-cmdline.md +++ b/episodes/12-cmdline.md @@ -450,11 +450,11 @@ def main(): data = numpy.loadtxt(filename, delimiter=',') if action == '--min': - values = numpy.amin(data, axis=1) + values = numpy.min(data, axis=1) elif action == '--mean': values = numpy.mean(data, axis=1) elif action == '--max': - values = numpy.amax(data, axis=1) + values = numpy.max(data, axis=1) for val in values: print(val) @@ -513,11 +513,11 @@ def process(filename, action): data = numpy.loadtxt(filename, delimiter=',') if action == '--min': - values = numpy.amin(data, axis=1) + values = numpy.min(data, axis=1) elif action == '--mean': values = numpy.mean(data, axis=1) elif action == '--max': - values = numpy.amax(data, axis=1) + values = numpy.max(data, axis=1) for val in values: print(val) @@ -611,11 +611,11 @@ def process(filename, action): data = numpy.loadtxt(filename, delimiter=',') if action == '--min': - values = numpy.amin(data, axis=1) + values = numpy.min(data, axis=1) elif action == '--mean': values = numpy.mean(data, axis=1) elif action == '--max': - values = numpy.amax(data, axis=1) + values = numpy.max(data, axis=1) for val in values: print(val) @@ -780,11 +780,11 @@ def process(filename, action): data = numpy.loadtxt(filename, delimiter=',') if action == '-n': - values = numpy.amin(data, axis=1) + values = numpy.min(data, axis=1) elif action == '-m': values = numpy.mean(data, axis=1) elif action == '-x': - values = numpy.amax(data, axis=1) + values = numpy.max(data, axis=1) for val in values: print(val) @@ -839,11 +839,11 @@ def process(filename, action): data = numpy.loadtxt(filename, delimiter=',') if action == '--min': - values = numpy.amin(data, axis=1) + values = numpy.min(data, axis=1) elif action == '--mean': values = numpy.mean(data, axis=1) elif action == '--max': - values = numpy.amax(data, axis=1) + values = numpy.max(data, axis=1) for val in values: print(val) @@ -893,11 +893,11 @@ def process(filename, action): data = numpy.loadtxt(filename, delimiter=',') if action == '--min': - values = numpy.amin(data, axis=1) + values = numpy.min(data, axis=1) elif action == '--mean': values = numpy.mean(data, axis=1) elif action == '--max': - values = numpy.amax(data, axis=1) + values = numpy.max(data, axis=1) for val in values: print(val) diff --git a/episodes/fig/generate_figures.py b/episodes/fig/generate_figures.py index 137676fa37..0ec35fa6d7 100755 --- a/episodes/fig/generate_figures.py +++ b/episodes/fig/generate_figures.py @@ -29,11 +29,11 @@ matplotlib.pyplot.savefig("inflammation-01-average.svg") matplotlib.pyplot.close() -matplotlib.pyplot.plot(numpy.amax(data, axis=0)) +matplotlib.pyplot.plot(numpy.max(data, axis=0)) matplotlib.pyplot.savefig("inflammation-01-maximum.svg") matplotlib.pyplot.close() -matplotlib.pyplot.plot(numpy.amin(data, axis=0)) +matplotlib.pyplot.plot(numpy.min(data, axis=0)) matplotlib.pyplot.savefig("inflammation-01-minimum.svg") matplotlib.pyplot.close() @@ -48,10 +48,10 @@ axes1.plot(numpy.mean(data, axis=0)) axes2.set_ylabel('max') -axes2.plot(numpy.amax(data, axis=0)) +axes2.plot(numpy.max(data, axis=0)) axes3.set_ylabel('min') -axes3.plot(numpy.amin(data, axis=0)) +axes3.plot(numpy.min(data, axis=0)) fig.tight_layout() matplotlib.pyplot.savefig("inflammation-01-group-plot.svg") @@ -69,10 +69,10 @@ axes1.plot(numpy.mean(data, axis=0), drawstyle='steps-mid') axes2.set_ylabel('max') -axes2.plot(numpy.amax(data, axis=0), drawstyle='steps-mid') +axes2.plot(numpy.max(data, axis=0), drawstyle='steps-mid') axes3.set_ylabel('min') -axes3.plot(numpy.amin(data, axis=0), drawstyle='steps-mid') +axes3.plot(numpy.min(data, axis=0), drawstyle='steps-mid') fig.tight_layout() matplotlib.pyplot.savefig("inflammation-01-line-styles.svg") diff --git a/episodes/fig/python-operations-across-axes.odg b/episodes/fig/python-operations-across-axes.odg deleted file mode 100644 index d4aed890767ab275c7b07d80bf10553b58f01778..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16221 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

(QHtGZ-zQVJ(x9*8n;X3e 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 S;Kn~GNs6*+GUZb5KK&1_?wF$h diff --git a/episodes/fig/python-operations-across-axes.svg b/episodes/fig/python-operations-across-axes.svg new file mode 100644 index 0000000000..440698420a --- /dev/null +++ b/episodes/fig/python-operations-across-axes.svg @@ -0,0 +1,394 @@ + + + +Day0Day1Day2PatientMaximumPatient 0Patient 1Patient 2Patient 3Maximum for each patientnumpy.max(data, axis=1)Day0Day1Day2Patient 0Patient 1Patient 2Patient 3DailyAverageAverage for each daynumpy.mean(data, axis=0) diff --git a/episodes/files/code/readings_04.py b/episodes/files/code/readings_04.py index ec4b524095..4fa93b2e18 100644 --- a/episodes/files/code/readings_04.py +++ b/episodes/files/code/readings_04.py @@ -11,11 +11,11 @@ def main(): data = numpy.loadtxt(filename, delimiter=',') if action == '--min': - values = numpy.amin(data, axis=1) + values = numpy.min(data, axis=1) elif action == '--mean': values = numpy.mean(data, axis=1) elif action == '--max': - values = numpy.amax(data, axis=1) + values = numpy.max(data, axis=1) for val in values: print(val) diff --git a/episodes/files/code/readings_05.py b/episodes/files/code/readings_05.py index f4a85d1b41..f51c19ddbf 100644 --- a/episodes/files/code/readings_05.py +++ b/episodes/files/code/readings_05.py @@ -14,11 +14,11 @@ def process(filename, action): data = numpy.loadtxt(filename, delimiter=',') if action == '--min': - values = numpy.amin(data, axis=1) + values = numpy.min(data, axis=1) elif action == '--mean': values = numpy.mean(data, axis=1) elif action == '--max': - values = numpy.amax(data, axis=1) + values = numpy.max(data, axis=1) for val in values: print(val) diff --git a/episodes/files/code/readings_06.py b/episodes/files/code/readings_06.py index 066ae3908d..0bb33d2ad1 100644 --- a/episodes/files/code/readings_06.py +++ b/episodes/files/code/readings_06.py @@ -17,11 +17,11 @@ def process(filename, action): data = numpy.loadtxt(filename, delimiter=',') if action == '--min': - values = numpy.amin(data, axis=1) + values = numpy.min(data, axis=1) elif action == '--mean': values = numpy.mean(data, axis=1) elif action == '--max': - values = numpy.amax(data, axis=1) + values = numpy.max(data, axis=1) for val in values: print(val) diff --git a/episodes/files/code/readings_07.py b/episodes/files/code/readings_07.py index beb166128c..6e003a5024 100644 --- a/episodes/files/code/readings_07.py +++ b/episodes/files/code/readings_07.py @@ -17,11 +17,11 @@ def process(filename, action): data = numpy.loadtxt(filename, delimiter=',') if action == '-n': - values = numpy.amin(data, axis=1) + values = numpy.min(data, axis=1) elif action == '-m': values = numpy.mean(data, axis=1) elif action == '-x': - values = numpy.amax(data, axis=1) + values = numpy.max(data, axis=1) for val in values: print(val) diff --git a/episodes/files/code/readings_08.py b/episodes/files/code/readings_08.py index 2dad1c8749..9563d5141e 100644 --- a/episodes/files/code/readings_08.py +++ b/episodes/files/code/readings_08.py @@ -26,11 +26,11 @@ def process(filename, action): data = numpy.loadtxt(filename, delimiter=',') if action == '--min': - values = numpy.amin(data, axis=1) + values = numpy.min(data, axis=1) elif action == '--mean': values = numpy.mean(data, axis=1) elif action == '--max': - values = numpy.amax(data, axis=1) + values = numpy.max(data, axis=1) for val in values: print(val) diff --git a/episodes/files/code/readings_09.py b/episodes/files/code/readings_09.py index a987567909..cf264688e4 100644 --- a/episodes/files/code/readings_09.py +++ b/episodes/files/code/readings_09.py @@ -21,11 +21,11 @@ def process(filename, action): data = numpy.loadtxt(filename, delimiter=',') if action == '--min': - values = numpy.amin(data, axis=1) + values = numpy.min(data, axis=1) elif action == '--mean': values = numpy.mean(data, axis=1) elif action == '--max': - values = numpy.amax(data, axis=1) + values = numpy.max(data, axis=1) for val in values: print(val) diff --git a/learners/discuss.md b/learners/discuss.md index f8ac3afaad..2cccdc406e 100644 --- a/learners/discuss.md +++ b/learners/discuss.md @@ -114,7 +114,7 @@ the minimum and maximum values in an array: import numpy def span(a): - diff = numpy.amax(a) - numpy.amin(a) + diff = numpy.max(a) - numpy.min(a) return diff data = numpy.loadtxt(fname='inflammation-01.csv', delimiter=',') From e542085d4b1f7750dda4df8444ccb447182d1901 Mon Sep 17 00:00:00 2001 From: Ed Bennett Date: Tue, 28 Apr 2026 20:20:28 +0100 Subject: [PATCH 2/2] simplify svg code for numpy axes operations illustration --- .../fig/python-operations-across-axes.svg | 473 +++--------------- 1 file changed, 79 insertions(+), 394 deletions(-) diff --git a/episodes/fig/python-operations-across-axes.svg b/episodes/fig/python-operations-across-axes.svg index 440698420a..fc8a731e4c 100644 --- a/episodes/fig/python-operations-across-axes.svg +++ b/episodes/fig/python-operations-across-axes.svg @@ -1,394 +1,79 @@ - - - -Day0Day1Day2PatientMaximumPatient 0Patient 1Patient 2Patient 3Maximum for each patientnumpy.max(data, axis=1)Day0Day1Day2Patient 0Patient 1Patient 2Patient 3DailyAverageAverage for each daynumpy.mean(data, axis=0) + + + + + + + + Day0 + Day1 + Day2 + + PatientMaximum + Patient 0 + Patient 1 + Patient 2 + Patient 3 + + Maximum for each patientnumpy.max(data, axis=1) + + + + Day0 + Day1 + Day2 + + Patient 0 + Patient 1 + Patient 2 + +Patient 3 + + + + + + + + DailyAverage + Average for each daynumpy.mean(data, axis=0) + + + + + + + + + + +