






import numpy as np
from PIL import Image






def       _lowerCAmelCase       (      lowerCAmelCase	,      lowerCAmelCase	,      lowerCAmelCase		):







       '''simple docstring'''
       UpperCAmelCase	    =			np.array(lowerCAmelCase		)
       if arr.shape[0] != arr.shape[1]:
              raise ValueError("""The input array is not a square matrix"""		)
       UpperCAmelCase	    =			0
       UpperCAmelCase	    =			0
       UpperCAmelCase	    =			0
       UpperCAmelCase	    =			0

       # compute the shape of the output matrix
       UpperCAmelCase	    =			(arr.shape[0] - size) // stride + 1
       # initialize the output matrix with zeros of shape maxpool_shape
       UpperCAmelCase	    =			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
                     UpperCAmelCase	    =			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
              UpperCAmelCase	    =			0
              UpperCAmelCase	    =			0

       return updated_arr






def       _lowerCAmelCase       (      lowerCAmelCase	,      lowerCAmelCase	,      lowerCAmelCase		):







       '''simple docstring'''
       UpperCAmelCase	    =			np.array(lowerCAmelCase		)
       if arr.shape[0] != arr.shape[1]:
              raise ValueError("""The input array is not a square matrix"""		)
       UpperCAmelCase	    =			0
       UpperCAmelCase	    =			0
       UpperCAmelCase	    =			0
       UpperCAmelCase	    =			0

       # compute the shape of the output matrix
       UpperCAmelCase	    =			(arr.shape[0] - size) // stride + 1
       # initialize the output matrix with zeros of shape avgpool_shape
       UpperCAmelCase	    =			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
                     UpperCAmelCase	    =			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
              UpperCAmelCase	    =			0
              UpperCAmelCase	    =			0

       return updated_arr


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

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

 # Loading the image
 lowerCAmelCase_	:    List[str]            =      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"""







def       _lowerCAmelCase       (      lowerCAmelCase		):







       '''simple docstring'''
       if not isinstance(lowerCAmelCase	,      lowerCAmelCase		):
              UpperCAmelCase	    =			F'''Input value of [number={number}] must be an integer'''
              raise TypeError(lowerCAmelCase		)
       if number < 0:
              return False
       UpperCAmelCase	    =			number * number
       while number > 0:
              if number % 10 != number_square % 10:
                     return False
              number //= 10
              number_square //= 10
       return True


if __name__ == "__main__":
 import doctest

 doctest.testmod()
