





import numpy as np
from PIL import Image






def 					SCREAMING_SNAKE_CASE__				(							UpperCamelCase__:				np.ndarray       , UpperCamelCase__:				int       , UpperCamelCase__:				int     ):
		SCREAMING_SNAKE_CASE__								=   np.array(UpperCamelCase__     )
		if arr.shape[0] != arr.shape[1]:
				raise ValueError("""The input array is not a square matrix"""     )
		SCREAMING_SNAKE_CASE__								=   0
		SCREAMING_SNAKE_CASE__								=   0
		SCREAMING_SNAKE_CASE__								=   0
		SCREAMING_SNAKE_CASE__								=   0

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

		return updated_arr






def 					SCREAMING_SNAKE_CASE__				(							UpperCamelCase__:				np.ndarray       , UpperCamelCase__:				int       , UpperCamelCase__:				int     ):
		SCREAMING_SNAKE_CASE__								=   np.array(UpperCamelCase__     )
		if arr.shape[0] != arr.shape[1]:
				raise ValueError("""The input array is not a square matrix"""     )
		SCREAMING_SNAKE_CASE__								=   0
		SCREAMING_SNAKE_CASE__								=   0
		SCREAMING_SNAKE_CASE__								=   0
		SCREAMING_SNAKE_CASE__								=   0

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

		return updated_arr


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

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

	# Loading the image
	_lowerCamelCase 					=      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 ..utils import DummyObject, requires_backends
class 							__lowerCAmelCase	(       metaclass=__magic_name__					):






       """simple docstring"""
       _snake_case      :	Dict									=       ['transformers', 'torch', 'note_seq']





       def __init__(				self  :						Tuple			,					*lowerCAmelCase__  :						List[str]			,					**lowerCAmelCase__  :						Optional[int]	)       ->	int:

            '''simple docstring'''




            requires_backends(self			,					['''transformers''', '''torch''', '''note_seq''']	)





       @classmethod
       def snake_case__		(				cls  :						Dict			,					*lowerCAmelCase__  :						Optional[Any]			,					**lowerCAmelCase__  :						Optional[int]	)       ->	Any:

            '''simple docstring'''




            requires_backends(cls			,					['''transformers''', '''torch''', '''note_seq''']	)







       @classmethod
       def snake_case__		(				cls  :						str			,					*lowerCAmelCase__  :						Any			,					**lowerCAmelCase__  :						List[Any]	)       ->	Tuple:

            '''simple docstring'''




            requires_backends(cls			,					['''transformers''', '''torch''', '''note_seq''']	)



