<SYSTEM_TASK:>
Given the following text description, write Python code to implement the functionality described below step by step
<END_TASK>
<USER_TASK:>
Description:
 Numpy
Objetivo
Step1:  Ahora que tenemos la librería, empecemos creando un vector de 5 elementos. 
La manera más común de crear una un vector o matriz ya inicializada es con la función np.array, que toma una lista (o lista de listas) como parámetro y devuelve una matriz de numpy.
Step2:  ¿Cuál es la diferencia entre vector y lista? Que vector, al ser un arreglo de numpy,  nos permite hacer varias operaciones matemáticas de forma muy simple.
Step3:  Índices y slices (rodajas) de vectores
Así como con las listas, se utilizan los corchetes ([ ]) para acceder a sus elementos, y se pueden tomar slices o rebanadas del arreglo utilizando 
Step4:  Creación de vectores con valor 0 o 1
Es muy común crear un vector con valores 0 o 1. Por ejemplo, cuando se utiliza un vector de contadores, donde cada contador comienza en 0. 
Para ello, utilizamos las funciones np.zeros y np.ones, respectivamente. Cada una toma como parámetro la cantidad de elementos del vector a crear.
Step5:  Matrices
Los vectores son arreglos de una sola dimensión. Las matrices son arreglos de dos dimensiones; generalmente a la primera dimensión se la llama la de las filas, mientras que a la otra se la llama la de las columnas.
Por ende, para crearlas con np.array, necesitamos no una lista de valores, sino una lista de valores por cada fila, o sea, una lista de listas. 
Del mismo modo, para crearlas con np.zeros o np.ones, vamos a necesitar una tupla con dos elementos, uno por cada dimensión.
Step6:  Accediendo a las matrices
También podemos usar slices para acceder a partes de las matrices. Las matrices tienen dos dimensiones, así que ahora tenemos que usar dos indices o slices para seleccionar partes.
Step7:  Modificando matrices
También podemos usar los slices para modificar matrices. La única diferencia es que ahora los usaremos para seleccionar que parte de la matriz vamos a cambiar.
Step8:  Ejercicios de repaso (no se harán durante el taller, son para practicar)
<ASSISTANT_TASK:>
Python Code:
# importamos la librería numpy, y le damos como nombre np dentro del programa
import numpy as np
Explanation: Numpy
Objetivo: Aprender a crear y manipular matrices utilizando la librería Numpy de Python.
Conocimientos previos: Programación básica en Python, concepto de vector y matriz.
Numpy es una librería para realizar cálculo numérico en python. La usaremos principalmente porque nos permite crear y modificar matrices, y hacer operaciones sobre ellas con facilidad.
Para comenzar a usar numpy, debemos importar la librería. En este caso la vamos a importar, y darle un sobrenombre al mismo tiempo, np, para que el código sea más legible
End of explanation
lista=[25,12,15,66,12.5]
vector=np.array(lista)
print(vector)
Explanation: Ahora que tenemos la librería, empecemos creando un vector de 5 elementos. 
La manera más común de crear una un vector o matriz ya inicializada es con la función np.array, que toma una lista (o lista de listas) como parámetro y devuelve una matriz de numpy.
End of explanation
print("- vector original")
print(vector)
print("- sumarle 1 a cada elemento del vector:")
print(vector+1)
print("- multiplicar por 5 cada elemento del vector:")
print(vector*5)
print("- suma de los elementos:")
print(np.sum(vector))
print("- promedio (media) de los elementos:")
print(np.mean(vector)) # 
print("- el vector sumado a si mismo:")
print(vector+vector)
print("- suma de vectores vector1 y vector2 (mismo tamaño):")
vector2=np.array([11,55,1.2,7.4,-8])
print(vector+vector2)
Explanation: ¿Cuál es la diferencia entre vector y lista? Que vector, al ser un arreglo de numpy,  nos permite hacer varias operaciones matemáticas de forma muy simple.
End of explanation
print(vector[3])
print(vector[1:4])
print(vector[1:])
print(vector[:4])
print(vector[:])
Explanation: Índices y slices (rodajas) de vectores
Así como con las listas, se utilizan los corchetes ([ ]) para acceder a sus elementos, y se pueden tomar slices o rebanadas del arreglo utilizando :
End of explanation
print("- Vector de ceros:")
vector_ceros=np.zeros(5)
print(vector_ceros)
print("- Vector de unos:")
vector_unos=np.ones(5)
print(vector_unos)
#Combinando este tipo de creaciones con las operaciones aritméticas,
#podemos hacer varias inicializaciones muy rápidamente
# Por ejemplo, para crear un vector cuyos valores iniciales son todos 2.
print("- Vector con todos los elementos con valor 2:")
vector_dos=np.zeros(5)+2
print(vector_dos)
print("- Vector con todos los elementos con valor 2 (otra forma):")
vector_dos_otro=np.ones((5))*2
print(vector_dos_otro)
Explanation: Creación de vectores con valor 0 o 1
Es muy común crear un vector con valores 0 o 1. Por ejemplo, cuando se utiliza un vector de contadores, donde cada contador comienza en 0. 
Para ello, utilizamos las funciones np.zeros y np.ones, respectivamente. Cada una toma como parámetro la cantidad de elementos del vector a crear.
End of explanation
print("- Matriz creada con una lista de listas:")
lista_de_listas=[ [1  ,-4], 
                  [12 , 3], 
                  [7.2, 5]]
matriz = np.array(lista_de_listas)
print(matriz)
print("- Matriz creada con np.zeros:")
dimensiones=(2,3)
matriz_ceros = np.zeros(dimensiones)
print(matriz_ceros)
print("- Matriz creada con np.ones:")
dimensiones=(3,2)
matriz_unos = np.ones(dimensiones)
print(matriz_unos)
#también podemos usar np.copy para copiar una matriz 
print("- Copia de la matriz creada con np.ones:")
matriz_unos_copia=np.copy(matriz_unos)
print(matriz_unos_copia)
# Ejercicio
# Crear una matriz de 4x9, que esté inicializada con el valor 0.5
#IMPLEMENTAR - COMIENZO
matriz=np.zeros((4,9))+0.5
# matriz=np.ones((4,9))*0.5   #(VERSION ALTERNATIVA)
#IMPLEMENTAR - FIN
print(matriz)
Explanation: Matrices
Los vectores son arreglos de una sola dimensión. Las matrices son arreglos de dos dimensiones; generalmente a la primera dimensión se la llama la de las filas, mientras que a la otra se la llama la de las columnas.
Por ende, para crearlas con np.array, necesitamos no una lista de valores, sino una lista de valores por cada fila, o sea, una lista de listas. 
Del mismo modo, para crearlas con np.zeros o np.ones, vamos a necesitar una tupla con dos elementos, uno por cada dimensión.
End of explanation
lista_de_listas=[ [1  ,-4], 
                  [12 , 3], 
                  [7.2, 5]]
a = np.array(lista_de_listas)
print("Elementos individuales")
print(a[0,1])
print(a[2,1])
print("Vector de elementos de la fila 1")
print(a[1,:])
print("Vector de elementos de la columna 0")
print(a[:,0])
print("Submatriz de 2x2 con las primeras dos filas")
print(a[0:2,:])
print("Submatriz de 2x2 con las ultimas dos filas")
print(a[1:3,:])
Explanation: Accediendo a las matrices
También podemos usar slices para acceder a partes de las matrices. Las matrices tienen dos dimensiones, así que ahora tenemos que usar dos indices o slices para seleccionar partes.
End of explanation
lista_de_listas=[ [1,-4], 
                  [12,3], 
                  [7, 5.0]]
a = np.array(lista_de_listas)
print("- Matriz original:")
print(a)
print("- Le asignamos el valor 4 a los elementos de la columna 0:")
a[:,0]=4
print(a)
print("- Dividimos por 3 la columna 1:")
a[:,1]=a[:,1]/3.0
print(a)
print("- Multiplicamos por 5 la fila 1:")
a[1,:]=a[1,:]*5
print(a)
print("- Le sumamos 1 a toda la matriz:")
a=a+1
print(a)
#Ejercicios
lista_de_listas=[ [-44,12], 
                  [12.0,51], 
                  [1300, -5.0]]
a = np.array(lista_de_listas)
print("Matriz original")
print(a)
# Restarle 5 a la fila 2 de la matriz
print("Luego de restarle 5 a la fila 2:")
#IMPLEMENTAR - COMIENZO
a[2,:]=a[2,:]-5
#IMPLEMENTAR - FIN
print(a)
# Multiplicar por 2 toda la matriz
print("Luego de multiplicar por 2 toda la matriz:")
#IMPLEMENTAR - COMIENZO
a = a * 2
#IMPLEMENTAR - FIN
print(a)
# Dividir por -5 las dos primeras filas de la matriz
print("Luego de dividir por -5 las primeras dos filas de la matriz:")
#IMPLEMENTAR - COMIENZO
a[0:2,:]=a[0:2,:]/5
#IMPLEMENTAR - FIN
print(a)
#Imprimir la ultima fila de la matriz
print("La última fila de la matriz:")
#IMPLEMENTAR - COMIENZO
ultima_fila=a[2,:]
#IMPLEMENTAR - FIN
print(ultima_fila)
# Más ejercicios
lista_de_listas=[ [-44,12], 
                  [12.0,51], 
                  [1300, -5.0]]
a = np.array(lista_de_listas)
# Calcular la suma y el promedio de los elementos de a utilizando dos fors anidados
suma = 0
promedio= 0
#IMPLEMENTAR - COMIENZO
for i in range(3):
    for j in range(2):
        suma+=a[i,j]
promedio=suma/(3*2)
print("La suma de los elementos de A es:")
print(suma)
print("El promedio de los elementos de A es:")
print(promedio)
#IMPLEMENTAR - FIN
# Imprimir la suma de los elementos de a utilizando np.sum
#IMPLEMENTAR - COMIENZO
print("La suma de los elementos de A es:")
print(np.sum(a))
#IMPLEMENTAR - FIN
# Imprimir el promedio de los elementos de a utilizando slices y np.mean
#IMPLEMENTAR - COMIENZO
print("El promedio de los elementos de A es:")
print(np.mean(a))
#IMPLEMENTAR - FIN
Explanation: Modificando matrices
También podemos usar los slices para modificar matrices. La única diferencia es que ahora los usaremos para seleccionar que parte de la matriz vamos a cambiar.
End of explanation
# Generar una matriz de 7 por 9. 
# Las primeras 3 columnas de la matriz tienen que tener el valor 0. 
# La siguiente columna debe tener el valor 0.5, excepto por el último valor de esa columna, que tiene que ser 0.7.
# Las otras tres columnas deben tener el valor 1.
#IMPLEMENTAR - COMIENZO
a=np.zeros((7,9))
a[:,3]=0.5
a[6,3]=0.7
a[:,4:]=1
# Luego imprimir la matriz
print("La matriz generada:")
print(a)
# Imprimir también el promedio de la ultima fila.
print("Promedio de la ultima fila")
print(np.mean(a[6,:]))
#IMPLEMENTAR - FIN
#La siguiente linea crea una matriz aleatoria de 5 por 5 con valores entre 0 y 1
matriz_aleatoria=np.random.rand(5,5) 
print("Valores de la matriz aleatoria:")
print(matriz_aleatoria)
#Imprimir las posiciones (Fila y columna) de los elementos de la matriz 
# que son mayores que 0.5
#IMPLEMENTAR - COMIENZO
print("Posiciones con valor mayor a 0.5:")
for i in range(5):
    for j in range(5):
        if matriz_aleatoria[i,j]>0.5:
            print(i,j)
#IMPLEMENTAR - FIN
Explanation: Ejercicios de repaso (no se harán durante el taller, son para practicar)
End of explanation
<END_TASK>