Numpy¶
NumPy es el paquete fundamental para la computación científica con Python. Contiene entre otras cosas:
un poderoso objeto de matriz N-dimensional
funciones sofisticadas (de transmisión)
herramientas para integrar código C / C ++ y Fortran
Álgebra lineal útil, transformada de Fourier y capacidades de números aleatorios
Además de sus obvios usos científicos, NumPy también se puede utilizar como un eficiente contenedor multidimensional de datos genéricos. Se pueden definir tipos de datos arbitrarios. Esto permite que NumPy se integre sin problemas y rápidamente con una amplia variedad de bases de datos.
NumPy tiene licencia bajo la licencia BSD, lo que permite su reutilización con pocas restricciones.
¿ Por qué usar Numpy ?¶
Las razones por las que debería usar NumPy en lugar de cualquier otro objeto _iterable
en Python son:
NumPy proporciona una estructura de ndarray para almacenar datos numéricos de manera contigua.
También implementa operaciones matemáticas rápidas en ndarrays, que explotan esta contigüidad.
Brevedad de la sintaxis para las operaciones de matriz.
Un lenguaje como C o Java requeriría que escribamos un bucle para una operación matricial tan simple como C = A + B.
Operaciones básicas de NumPy¶
Las razones por las que debería usar NumPy en lugar de cualquier otro objeto _iterable
en Python son:
NumPy proporciona una estructura de ndarray para almacenar datos numéricos de manera contigua.
También implementa operaciones matemáticas rápidas en ndarrays, que explotan esta contigüidad.
Brevedad de la sintaxis para las operaciones de matriz.
Un lenguaje como C o Java requeriría que escribamos un bucle para una operación matricial tan simple como C = A + B.
Manipulación de datos¶
En esta sección se presentan operaciones básicas de los arreglos de numpy.
Añadir filas y columnas
Para añadir una columna, se debe asegurar que se este agregando un arreglo de tamaño: (1,n)
Para añadir una columna, se debe asegurar que se este agregando un arreglo de tamaño (n,)
Observación:
Se debe tener cuidado al momento de operar vectores con dimensión (1,n) o (n,).
Para añadir filas o columnas a una matriz o juntar arreglos de numpy, se puede utilizar la función
np.concatenate()
.
Operaciones matemáticas básicas de matrices¶
La mayoría de las operaciones realizadas en NumPy se manejan por elementos, es decir, calcular C = A + B se traducirá en C[i,j]=A[i,j]+B[i,j]. (La excepción es la transmisión y se explicará pronto).
A continuación hay una lista con las operaciones matemáticas más comunes.
np.exp()
[[2.71828183e+00 7.38905610e+00 2.00855369e+01]
[5.45981500e+01 1.48413159e+02 4.03428793e+02]
[1.09663316e+03 2.98095799e+03 8.10308393e+03]]
np.sin()
[[ 0.84147098 0.90929743 0.14112001]
[-0.7568025 -0.95892427 -0.2794155 ]
[ 0.6569866 0.98935825 0.41211849]]
np.cos()
[[ 0.54030231 -0.41614684 -0.9899925 ]
[-0.65364362 0.28366219 0.96017029]
[ 0.75390225 -0.14550003 -0.91113026]]
np.tan()
[[ 1.55740772 -2.18503986 -0.14254654]
[ 1.15782128 -3.38051501 -0.29100619]
[ 0.87144798 -6.79971146 -0.45231566]]
Álgebra Lineal¶
En esta sección se presentan algunas propiedades comunmente ocupadas en álgebra lineal de matrices.
Broadcasting¶
Unas de las ventajas de numpy es que podemos hacer broadcasting, es to significa que numpy permite realizar operaciones binarias con arreglos de distintos tamaños.
Python Lists vs. Numpy Arrays¶
La librería principal de Python son las listas. Una lista es el equivalente a Python de una matriz, pero es redimensionable y puede contener elementos de diferentes tipos.
Una pregunta común para principiantes es cuál es la verdadera diferencia aquí. La respuesta es el rendimiento. Las estructuras de datos de Numpy funcionan mejor en:
Tamaño: las estructuras de datos de Numpy ocupan menos espacio
Rendimiento: necesitan velocidad y son más rápidos que las listas
Funcionalidad: SciPy y NumPy tienen funciones optimizadas, como las operaciones de álgebra lineal integradas.
Memoria¶
Los principales beneficios del uso de matrices NumPy deberían ser un menor consumo de memoria y un mejor comportamiento en tiempo de ejecución.
Para las listas de Python: podemos concluir de esto que para cada elemento nuevo, necesitamos otros ocho bytes para la referencia al nuevo objeto. El nuevo objeto entero en sí consume 28 bytes. El tamaño de una lista lst sin el tamaño de los elementos se puede calcular con:
NumPy ocupa menos espacio. Esto significa que una matriz entera arbitraria de longitud n en necesidades numpy se calcula por:
Para convensernos de esto, ejecutemos un ejemplo:
# example
# class: array
class Array:
"""
Clase array que da como rsultado el tiempo y espacio en
memoria de los objetos list y numpy array
"""
def __init__(self, size_of_vec):
self.size_of_vec = size_of_vec
def pure_python_version(self):
"""
Tiempo y espacio en memoria para objeto list
"""
t1 = time.time()
X = range(self.size_of_vec)
Y = range(self.size_of_vec)
Z = [X[i] + Y[i] for i in range(len(X)) ]
return (time.time() - t1,sys.getsizeof(Z) )
def numpy_version(self):
"""
Tiempo y espacio en memoria para objeto numpy array
"""
t1 = time.time()
X = np.arange(self.size_of_vec)
Y = np.arange(self.size_of_vec)
Z = X + Y
return (time.time() - t1,sys.getsizeof(Z) )