diff --git a/numpy_questions.py b/numpy_questions.py index 07a10c1..c63283d 100644 --- a/numpy_questions.py +++ b/numpy_questions.py @@ -1,20 +1,12 @@ -"""Assignment - using numpy and making a PR. - -The goals of this assignment are: - * Use numpy in practice with two easy exercises. - * Use automated tools to validate the code (`pytest` and `flake8`) - * Submit a Pull-Request on github to practice `git`. - -The two functions below are skeleton functions. The docstrings explain what -are the inputs, the outputs and the expected error. Fill the function to -complete the assignment. The code should be able to pass the test that we -wrote. To run the tests, use `pytest test_numpy_question.py` at the root of -the repo. It should say that 2 tests ran with success. - -We also ask to respect the pep8 convention: https://pep8.org. -This will be enforced with `flake8`. You can check that there is no flake8 -errors by calling `flake8` at the root of the repo. +"""This module implements functions for numpy-based operations. + +It includes: +1. max_index: Returns the index of the maximum value in a 2D numpy array. +2. wallis_product: Computes an approximation of pi using the Wallis product. + +The module is designed for practicing numpy, automated tools, and git workflows. """ + import numpy as np @@ -29,7 +21,7 @@ def max_index(X): Returns ------- (i, j) : tuple(int) - The row and columnd index of the maximum. + The row and column index of the maximum. Raises ------ @@ -37,10 +29,23 @@ def max_index(X): If the input is not a numpy array or if the shape is not 2D. """ - i = 0 - j = 0 + # Check whether input is a numpy array + if not isinstance(X, np.ndarray): + raise ValueError("Input array is not a numpy array.") + + # Check whether input is 2D array + if X.ndim != 2: + raise ValueError("Input array is not 2D.") + + # Initialize the max value and indices + max_val = float('-inf') + i, j = 0, 0 - # TODO + for row in range(X.shape[0]): # Iterate through all rows + for col in range(X.shape[1]): # Iterate through all columns + if X[row, col] > max_val: + max_val = X[row, col] # Update the maximum value + i, j = row, col # Update the indices of the maximum return i, j @@ -61,7 +66,19 @@ def wallis_product(n_terms): ------- pi : float The approximation of order `n_terms` of pi using the Wallis product. + + Raises + ------ + ValueError + If n_terms is negative. """ - # XXX : The n_terms is an int that corresponds to the number of - # terms in the product. For example 10000. - return 0. + if n_terms < 0: + raise ValueError("n_terms must be a non-negative integer.") + # `n_terms=0` will consider the product to be 1 + product = 1.0 + # Iterate from 1 to n_terms + for n in range(1, n_terms + 1): + numerator = 4 * n**2 + denominator = 4 * n**2 - 1 + product *= numerator / denominator # Compute each term in the product + return 2 * product # Multiply by 2 to compute pi