"""simple docstring"""






import numpy as np
from PIL import Image


def 			UpperCAmelCase__       (				lowerCAmelCase__     :np.ndarray					,		lowerCAmelCase__     :int					,		lowerCAmelCase__     :int		) ->    np.ndarray:
      '''simple docstring'''


      lowercase														=	np.array(lowerCAmelCase__		)
      if arr.shape[0] != arr.shape[1]:
            raise ValueError("""The input array is not a square matrix"""		)
      lowercase														=	0
      lowercase														=	0
      lowercase														=	0
      lowercase														=	0

      # compute the shape of the output matrix
      lowercase														=	(arr.shape[0] - size) // stride + 1
      # initialize the output matrix with zeros of shape maxpool_shape
      lowercase														=	np.zeros((maxpool_shape, maxpool_shape)		)

      while i < arr.shape[0]:
            if i + size > arr.shape[0]:
                  # if the end of the matrix is reached, break
                  break
            while j < arr.shape[1]:
                  # if the end of the matrix is reached, break
                  if j + size > arr.shape[1]:
                        break
                  # compute the maximum of the pooling matrix
                  lowercase														=	np.max(arr[i : i + size, j : j + size]		)
                  # shift the pooling matrix by stride of column pixels
                  j += stride
                  mat_j += 1

            # shift the pooling matrix by stride of row pixels
            i += stride
            mat_i += 1

            # reset the column index to 0
            lowercase														=	0
            lowercase														=	0

      return updated_arr


def 			UpperCAmelCase__       (				lowerCAmelCase__     :np.ndarray					,		lowerCAmelCase__     :int					,		lowerCAmelCase__     :int		) ->    np.ndarray:
      '''simple docstring'''


      lowercase														=	np.array(lowerCAmelCase__		)
      if arr.shape[0] != arr.shape[1]:
            raise ValueError("""The input array is not a square matrix"""		)
      lowercase														=	0
      lowercase														=	0
      lowercase														=	0
      lowercase														=	0

      # compute the shape of the output matrix
      lowercase														=	(arr.shape[0] - size) // stride + 1
      # initialize the output matrix with zeros of shape avgpool_shape
      lowercase														=	np.zeros((avgpool_shape, avgpool_shape)		)

      while i < arr.shape[0]:
            # if the end of the matrix is reached, break
            if i + size > arr.shape[0]:
                  break
            while j < arr.shape[1]:
                  # if the end of the matrix is reached, break
                  if j + size > arr.shape[1]:
                        break
                  # compute the average of the pooling matrix
                  lowercase														=	int(np.average(arr[i : i + size, j : j + size]		)		)
                  # shift the pooling matrix by stride of column pixels
                  j += stride
                  mat_j += 1

            # shift the pooling matrix by stride of row pixels
            i += stride
            mat_i += 1
            # reset the column index to 0
            lowercase														=	0
            lowercase														=	0

      return updated_arr


# Main Function
if __name__ == "__main__":
       from doctest import testmod

       testmod(name="""avgpooling""", verbose=True)

       # Loading the image
       __lowerCAmelCase    :       Union[str, Any]					     =Image.open("""path_to_image""")

       # Converting the image to numpy array and maxpooling, displaying the result
       # Ensure that the image is a square matrix

       Image.fromarray(maxpooling(np.array(image), size=3, stride=2)).show()

       # Converting the image to numpy array and averagepooling, displaying the result
       # Ensure that the image is a square matrix

       Image.fromarray(avgpooling(np.array(image), size=3, stride=2)).show()




"""simple docstring"""






from __future__ import annotations

import numpy as np


def 			UpperCAmelCase__       (				lowerCAmelCase__     :list[float]		) ->    Optional[Any]:
      '''simple docstring'''


      return np.maximum(0					,		lowerCAmelCase__		)


if __name__ == "__main__":
       print(np.array(relu([-1, 0, 5])))  # --> [0, 0, 5]



