viernes, 8 de enero de 2021

3) Matemáticas con Numpy












Matemáticas con Numpy


Operaciones aritméticas con un mismo valor.

Todas las operaciones aritméticas básicas (sumar, restar, multiplicar y dividir) que se puedan hacer con matrices se pueden hacer en Numpy. Se puede operar un  único valor con todos los elementos del array, elemento a elemento, usando los signos matemáticos + (sumar), - (restar),  * (multiplicar), / (dividir), ** (potenciación), // (división, cociente como entero).

Puedes encontrar todas las operaciones matemáticas que se pueden hacer con Numpy en su documentación en este enlace.

Por ejemplo:

>>> import numpy as np
>>> a=np.array([3,4,5])
>>> b=3
>>> print(a*b)
[ 9 12 15]
>>> print(a+b)
[6 7 8]
>>> print(a-b)
[0 1 2]
>>> print(a/b)
[1.         1.33333333 1.66666667]
>>> print(a**b)
[ 27  64 125]
>>> print(a*a)
[ 9 16 25]


Operaciones elementales.


Esta biblioteca nos proporciona un montón de funciones matemáticas elementales (seno, coseno, exponencial, raíz cuadrada, logaritmos...) que se pueden utilizar con matrices o tambien con un solo elemento o número. Podrías utilizar Numpy como alternativa al módulo maths que viene por defecto en Python.

Veámoslo con ejemplos:

Creemos una matriz con 8 elementos que se distribuyan de forma uniforme desde -pi a +pi. Pi lo obtendremos usando el módulo math de Python.

>>> import numpy as np, math
>>> a=np.linspace(-math.pi,math.pi,8)
>>> print(a)
[-3.14159265 -2.24399475 -1.34639685 -0.44879895  0.44879895  1.34639685
  2.24399475  3.14159265]

Y fácilmente podemos calcular el seno de cada uno de los valores:

>>> print(np.sin(a))
[-1.22464680e-16 -7.81831482e-01 -9.74927912e-01 -4.33883739e-01
  4.33883739e-01  9.74927912e-01  7.81831482e-01  1.22464680e-16]


Esto no lo podríamos hacer de forma tan sencilla usando el módulo math, porque te daría error.

>>> print(math.sin(a))
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-8-6e5434b920e7> in <module>
----> 1 print(math.sin(a))

TypeError: only size-1 arrays can be converted to Python scalars


Operaciones con matrices de la misma dimensión.


Al igual que hemos visto antes, podemos hacer las mismas operaciones aritméticas sencillas con matrices que tengan la misma dimensión.

Por ejemplo creamos una matriz de dimensiones 2x3 llamada "a" con unos valores ya dados y otra "b" de dimensiones 2x3 rellena con unos. Y vamos a sumarlas y restarlas elemento a elemento.





Y al igual que con la suma y la resta podríamos hacerlo con la multiplicación y división.


Operaciones con matrices de diferentes dimensiones.


Aunque para sumar o restar matrices estas tienen que ser de la misma dimensión, lo que si nos permite Numpy es "sumar o restar" arrays de diferentes dimensiones siempre que el array resultante tenga la misma dimensión que uno de los arrays operados. Y lo hace de la siguiente forma. Veámoslo con un ejemplo. 

El array "a" tiene una dimensión de (2,3) y el "b" de (3,1). Si las sumamos, Numpy sumará elemento a elemento la primera fila de "a" con los elementos de "b" y luego sumará la segunda fila de "a" con los elemnentos de "b" lo que nos dará el array "c"



Para multiplicar matrices tenemos que tener en cuenta que el numero de columnas de la primera matriz tiene que ser igual al numero de filas de la segunda.

Si utilizamos las matrices del ejemplo anterior podemos multiplicarlas con el siguiente código ya que se cumple la condición que hemos dicho a=(2,3) b=(3,1). El número de columnas de a es igual al numero de filas de b.



y lo mismo ocurriría con la división.


Funciones matemáticas para operar con arrays.


Después de haber visto las operaciones básicas que podemos hacer con los arrays, Numpy tiene también una gran cantidad de funciones que podemos aplicar a las matrices. Puedes ver en este enlace la relación de ellas. 




Básicamente todas funcionan de la misma forma así que veamos algunas de ellas.

Por ejemplo, si queremos saber el valor máximo de un array podemos utilizar la función max()


>>> import numpy as np
>>> a=np.array([[2,5,7],[4,3,8]])
>>> print(np.max(a))
8

u obtener la suma de todos los valores del array con la función sum()

>>> import numpy as np
>>> a=np.array([[2,5,7],[4,3,8]])
>>> print(np.sum(a))
29

u operaciones estadísticas como obtener la media de los elementos de un array con mean()


>>> import numpy as np
>>> a=np.array([[2,5,7],[4,3,8]])
>>> print(np.mean(a))
4.833333333333333


Hay muchísimas funciones para cualquier cosa que necesites hacer con los array con lo cual lo mejor es consultar la documentación y ver la información sobre la función que buscas.


Gráficos con Numpy.


Esta librería se integra perfectamente con MatPlotLib.pyplot a la hora de realizar gráficos de forma sencilla con nuestros datos.  Solo tenemos que pasar los arrays con los datos a MatPlotLib.pyplot que se encargará de todo. 

Por ejemplo si queremos hacer una gráfica de la función seno, la podríamos realizar de la siguiente manera.


import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0,2*np.pi,200)
y = np.sin(x)
plt.plot(x,y,label='funcion seno')
plt.legend()
plt.xlabel('Eje de las X')
plt.ylabel('Eje de las Y')
plt.title('Función seno Radianes')
plt.show()



Puedes encontrar más información sobre realizar graficos en Python con MatPlotLib en este post.


Vamos a repasar lo que hemos visto hasta ahora y ampliar de forma somera algunos conceptos, a forma de resumen donde puedas buscar las operaciones más comunes que se pueden hacer con arrays. 


OPERACIONES ELEMENTO A ELEMENTO


Hemos visto que en las operaciones que se realizan entre un array y un escalar,  todas se hacen elemento a elemento.

Con escalares


>>> a = np.array([1, 2, 3, 4])

>>> a + 1

array([2, 3, 4, 5])

>>> 2**a

array([ 2, 4, 8, 16])


Toda las operaciones aritméticas son elemento a elemento


>>> b = np.ones(4) + 1

>>> a - b

array([-1., 0., 1., 2.])

>>> a * b

array([ 2., 4., 6., 8.])

>>> j = np.arange(5)

>>> 2**(j + 1) - j

array([ 2, 3, 6, 13, 28])



Advertencia Importante: Multiplicación de arreglos no es multiplicación matricial:

>>> a = np.array([[2,0,1],[3,0,0],[5,1,1]])

>>> b = np.array([[1,0,1],[1,2,1],[1,1,0]])

>>> print(a*b)

[[2 0 1]

 [3 0 0]

 [5 1 0]]

>>> # ¡no es multiplicación matricial!

Si queremos multiplicar matrices tenemos que usar el método np.dot()

>>> print(np.dot(a,b))

[[3 1 2]
 [3 0 3]
 [7 3 6]]


Comparaciones de Arrays.


>>> a = np.array([1, 2, 3, 4])

>>> b = np.array([4, 2, 2, 4])

>>> a == b

array([False, True, False, True], dtype=bool)

>>> a > b

array([False, False, True, False], dtype=bool)


Operaciones Lógicas



>>> a = np.array([1, 1, 0, 0], dtype=bool)

>>> b = np.array([1, 0, 1, 0], dtype=bool)

>>> np.logical_or(a, b)
array([ True, True, True, False], dtype=bool)

>>> np.logical_and(a, b)
array([ True, False, False, False], dtype=bool)


Transpuesta de un matriz

La transpuesta de la matriz:

[[ 1, 2]
 [ 3, 4]
 [ 5, 6]]

será:

>>> a = np.array([[1,2],[3,4],[5,6]])

>>> a.T  # también, a.transpose()
array([[1, 3, 5],
           [2, 4, 6]])



REDUCCIONES BÁSICAS.


Sumando los elementos de un array.

>>> x = np.array([1, 2, 3, 4])
>>> np.sum(x)
10
>>> x.sum()
10

Sumando los elementos de un array por filas o por columnas.

Para el tema de los ejes tienes que tener en cuenta los siguiente:

axis = 0 Se refiere al vertical. Suma los elementos de la misma columna.
axis = 1 Se refiere al eje horizontal. Suma los elementos de la misma fila.

Vamos a aplicarlo a un ejemplo.


>>> x = np.array([[1, 1], [2, 2]])
>>> x
array([[1, 1],
           [2, 2]])
>>> x.sum(axis=0) # columna (primera dimensión)
array([3, 3])

>>> x[:, 0].sum(), x[:, 1].sum()
(3, 3)

>>> x.sum(axis=1) # fila (segunda dimensión)
array([2, 4])
>>> x[0, :].sum(), x[1, :].sum()
(2, 4)


Reducciones Estadísticas.

Las reducciones estadísticas funcionan de la misma manera que las sumas.

Veamos unos ejemplos con las funciones estadísticas más significativas.

Calculo de la media.

>>> x = np.array([1, 2, 3, 1])

>>> y = np.array([[1, 2, 3], [5, 6, 1]])

>>> x.mean()
1.75

Cálculo de la mediana.

>>> np.median(x)
1.5

>>> np.median(y, axis=1)
array([ 2., 5.])


Cálculo de la desviación estandar

>>> x.std() # desviación estándar de población (no de la muestra).
0.82915619758884995


Valor mínimo y máximo de un array.

>>> x = np.array([1, 3, 2])

# Valor mínimo
>>> x.min()
1

# Valor máximo
>>> x.max()
3

x.argmin() # índice del valor mínimo en el array
0
x.argmax() # índice del valor máximo en el array
1


Operaciones Lógicas.

numpy.all() -> Comprueba si todos los elementos a lo largo de un eje dado son igual a True.

>>> y = np.array([1,2,3,4,0,9])
>>> np.all(y)
False

numpy.any() -> Comprueba si al menos algún elemento del array a lo largo de un eje dado es igual a True.

>>> np.any(y)
True


Ordenando datos.


- Ordenando los elementos a lo largo de un eje.

>>> a = np.array([[4, 3, 5], [1, 2, 1]])
>>> b = np.sort(a, axis=1)
>>> b
array([[3, 4, 5],
           [1, 1, 2]])

¡ Ten en cuenta que se ordenan filas y columnas por separado!


- Ordenando y reemplazando los elementos.

>>> a.sort(axis=1)
>>> a
array([[3, 4, 5],
           [1, 1, 2]])


No hay comentarios:

Publicar un comentario