<jupyter_start><jupyter_text>MAT281 - Laboratorio N°02 Objetivos de la clase* Reforzar los conceptos básicos de numpy.  <NAME> 201510509-K  Contenidos* [Problema 01](p1)* [Problema 02](p2)* [Problema 03](p3)<jupyter_code>import numpy as np
import time
import sys<jupyter_output><empty_output><jupyter_text>Problema 01Una **media móvil simple** (SMA) es el promedio de los últimos $k$ datos anteriores, es decir, sea $a_1$,$a_2$,...,$a_n$ un arreglo $n$-dimensional, entonces la SMA se define por:$$sma(k) =\dfrac{1}{k}(a_{n}+a_{n-1}+...+a_{n-(k-1)}) = \dfrac{1}{k}\sum_{i=0}^{k-1}a_{n-i}  $$ Por otro lado podemos definir el SMA con una venta móvil de $n$ si el resultado nos retorna la el promedio ponderado avanzando de la siguiente forma:* $a = [1,2,3,4,5]$, la SMA con una ventana de $n=2$ sería:    * sma(2): [mean(1,2),mean(2,3),mean(3,4)] = [1.5, 2.5, 3.5, 4.5]    * sma(3): [mean(1,2,3),mean(2,3,4),mean(3,4,5)] = [2.,3.,4.]Implemente una función llamada `sma` cuyo input sea un arreglo unidimensional $a$ y un entero $n$, y cuyo ouput retorne el valor de la media móvil simple sobre el arreglo de la siguiente forma:* **Ejemplo**: *sma([5,3,8,10,2,1,5,1,0,2], 2)* = $[4. , 5.5, 9. , 6. , 1.5, 3. , 3. , 0.5, 1. ]$En este caso, se esta calculando el SMA para un arreglo con una ventana de $n=2$.**Hint**: utilice la función `numpy.cumsum`<jupyter_code>def sma(a,n):
    arr=np.zeros(len(a)-(n-1)) #Arreglo solo con ceros
    for i in range(0,len(a)-(n-1)):
        arr[i]=np.sum(a[i:i+n])/n #sumamos los valores respectivos 
    return arr

sma([5,3,8,10,2,1,5,1,0,2],2)<jupyter_output><empty_output><jupyter_text>Problema 02La función **strides($a,n,p$)**, corresponde a transformar un arreglo unidimensional $a$ en una matriz de $n$ columnas, en el cual las filas se van construyendo desfasando la posición del arreglo en $p$ pasos hacia adelante.* Para el arreglo unidimensional $a$ = [ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10], la función strides($a,4,2$), corresponde a crear una matriz de $4$ columnas, cuyos desfaces hacia adelante se hacen de dos en dos. El resultado tendría que ser algo así:$$\begin{pmatrix} 1& 2 &3 &4 \\  3&  4&5&6 \\  5& 6 &7 &8 \\  7& 8 &9 &10 \\ \end{pmatrix}$$Implemente una función llamada `strides(a,4,2)` cuyo input sea un arreglo unidimensional y retorne la matriz de $4$ columnas, cuyos desfaces hacia adelante se hacen de dos en dos. * **Ejemplo**: *strides($a$,4,2)* =$\begin{pmatrix} 1& 2 &3 &4 \\  3&  4&5&6 \\  5& 6 &7 &8 \\  7& 8 &9 &10 \\ \end{pmatrix}$<jupyter_code>def strides(a,n,p):
    lista=[] #Lista vacia
    matriz=[] #Lista vacia que luego sera nuestra matriz de retorno
    for fila in range (0,len(a)-(n-1),p): 
        lista=[]
        for columna in range (0,n):
            lista.append(a[fila+columna]) #Agrega los valores de cada fila de la matriz final
        matriz.append(lista) #Agrega la fila respectiva a la matriz
    return np.array(matriz)

strides( [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10],4,2)<jupyter_output><empty_output><jupyter_text>Problema 03Un **cuadrado mágico** es una matriz de tamaño $n \times n$ de números enteros positivos tal que la suma de los números por columnas, filas y diagonales principales sea la misma. Usualmente, los números empleados para rellenar las casillas son consecutivos, de 1 a $n^2$, siendo $n$ el número de columnas y filas del cuadrado mágico.Si los números son consecutivos de 1 a $n^2$, la suma de los números por columnas, filas y diagonales principales es igual a : $$M_{n} = \dfrac{n(n^2+1)}{2}$$Por ejemplo, * $A= \begin{pmatrix} 4& 9 &2 \\  3&  5&7 \\  8& 1 &6 \end{pmatrix}$,es un cuadrado mágico.* $B= \begin{pmatrix} 4& 2 &9 \\  3&  5&7 \\  8& 1 &6 \end{pmatrix}$, no es un cuadrado mágico.Implemente una función llamada `es_cudrado_magico` cuyo input sea una matriz cuadrada de tamaño $n$ con números consecutivos de $1$ a $n^2$ y cuyo ouput retorne *True* si es un cuadrado mágico o 'False', en caso contrario* **Ejemplo**: *es_cudrado_magico($A$)* = True, *es_cudrado_magico($B$)* = False**Hint**: Cree una función que valide la mariz es cuadrada y  que sus números son consecutivos del 1 a $n^2$.<jupyter_code>def es_cuadrado_magico(A):
    fila=np.sum(A , axis=1)#Sumamos los valores de las filas.
    columna=np.sum(A , axis=0)#Sumamos los valores de las columnas.
    diagonal1=np.trace(A)#Sumamos los valores de la diagonal principal.
    diagonal2=np.trace(np.fliplr(A))#Sumamos los valores de la diagonal secundaria.
    #Ahora se verifica si los valores de la suma de filas, columnas y diagonales son iguales, retornando True en caso afirmativo
    #y retorna False en caso contrario.
    if np.array_equiv(diagonal1,diagonal2) and np.array_equiv(fila,columna) and  np.array_equiv(diagonal1,columna):
        return True
    else:
        return False
    
A = np.array([[4,9,2],[3,5,7],[8,1,6]])
es_cuadrado_magico(A)
B = np.array([[4,2,9],[3,5,7],[8,1,6]])
es_cuadrado_magico(B)<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.1489577008702692, 'fraction_numerical': 0.04735883424408015, 'mean_word_length': 4.313978494623656, 'pattern_counts': {'":': 0, '<': 18, '<?xml version=': 0, '>': 18, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 2, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '4', 'dir': 'jupyter-structured-clean-dedup', 'id': '535987', 'license': 'MIT', 'n_tokens_mistral': 2092, 'n_tokens_neox': 2005, 'n_words': 624, 'path': 'labs/02_numpy/laboratorio_02.ipynb', 'repo_name': 'FabianSaulRubilarAlvarez/mat281_portfolio_template', 'size': '4957'}