<jupyter_start><jupyter_text>Before you turn this problem in, make sure everything runs as expected. First, **restart the kernel** (in the menubar, select Kernel$\rightarrow$Restart) and then **run all cells** (in the menubar, select Cell$\rightarrow$Run All).Make sure you fill in any place that says `YOUR CODE HERE` or "YOUR ANSWER HERE", as well as your name and collaborators below:<jupyter_code>NAME = "<NAME>"
COLLABORATORS = ""<jupyter_output><empty_output><jupyter_text>---  Exercício Prático 1: ConvoluçãoNeste exercício iremos implementar a função que calcula a convolução de uma matriz ```top``` sobre uma imagem. Não é permitido usar as funções correlate ou convolve de scipy.ndimage.filters.<jupyter_code># importa as bibliotecas e seta alguns parâmetros

%matplotlib inline
import numpy as np
from sklearn.datasets import fetch_openml
from matplotlib import pyplot as plt, rcParams
rcParams['figure.figsize'] = 3, 6
%precision 4
np.set_printoptions(precision=4, linewidth=100)
# define duas funções para imprimir matrizes como imagens

def plots(ims, interp=False, titles=None):
    ims=np.array(ims)
    mn,mx=ims.min(),ims.max()
    f = plt.figure(figsize=(12,24))
    for i in range(len(ims)):
        sp=f.add_subplot(1, len(ims), i+1)
        if not titles is None: sp.set_title(titles[i], fontsize=18)
        plt.imshow(ims[i], interpolation=None if interp else 'none', vmin=mn,vmax=mx)

def plot(im, interp=False):
    f = plt.figure(figsize=(3,6), frameon=True)
    # plt.show(im)
    plt.imshow(im, interpolation=None if interp else 'none')

plt.gray()
plt.close()
# carrega um '5' escrito a mão a partir do arquivo exemplo.npy
with open('entrada.npy','rb') as infile:
    image = np.load(infile)
# Baixa e carrega o dataset mnist_784 que contém 70000 dígitos escritos a mão.
# Ele foi comentado pois não será necessário.

# from sklearn.datasets import fetch_openml
# mnist = fetch_openml('mnist_784', version=1, cache=True)
# images = np.reshape(mnist['data'], (70000, 28, 28))
# labels = mnist['target'].astype(int)
# n=len(images)
# images.shape, labels.shape
# images = images/255
# image = images[0]
# plota imagem
plot(image)
# define e plota matriz top

top=[[-1,-1,-1],
     [ 1, 1, 1],
     [ 0, 0, 0]]

top = np.array(top)
plot(top)
def convolucao(top, image):
    """ Calcula a matriz result que é obtida pela convolução da matriz top
        sobre a imagem image.
        
        Dicas:
        1. Inicializar a matriz result com np.zeros ou np.empty (Qual o número de linhas? E de colunas?)
        2. Iterar sobre cada posição de result fazendo a combinação linear dos coeficientes de top e das
           posições correspondentes em image. Note que é possível multiplicar matrizes elemento a elemento
           usando o operador *. Consulte np.sum() também.
        3. Retornar result
    """
    result = np.zeros([image.shape[0]-top.shape[0]+1, image.shape[1]-top.shape[0]+1])
    result = result
    for line in range(result.shape[0]):
        for col in range(result.shape[1]):
            matrix = np.array(image[line:line+top.shape[0], col:col+top.shape[1]])
            matrix = top*matrix
            result.itemset((line, col), np.sum(matrix))
    return result
# plota result
result = convolucao(top,image)
plot(result)
with open('saida.npy','rb') as infile:
    answer = np.load(infile)
assert (result == answer).all()

# additional *hidden* tests<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.11891576799766831, 'fraction_numerical': 0.019236374234916934, 'mean_word_length': 3.959537572254335, 'pattern_counts': {'":': 0, '<': 10, '<?xml version=': 0, '>': 10, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '2', 'dir': 'jupyter-structured-clean-dedup', 'id': '179190', 'license': 'MIT', 'n_tokens_mistral': 1239, 'n_tokens_neox': 1192, 'n_words': 365, 'path': 'alc/ep1/ep1.ipynb', 'repo_name': 'brenopoggiali/BCC', 'size': '3448'}