Saltar al contenido

Una vuelta alrededor de la pila de PyData

El paquete numpy maneja tareas de computación numérica usando el lenguaje Python. Ahora, no dejes que la frase computación numérica te asuste. Pronto verás cómo numpy maneja la mayor parte del trabajo duro por ti. Ese trabajo duro consiste en gran parte en manipular estructuras de datos multidimensionales.

Considere la tarea de la multiplicación de la matriz. Multiplicar una matriz de 2×3 con una matriz de 3×4 dará, después de 24 operaciones de multiplicación y 8 operaciones de adición, una matriz de 2×4. Y esto se hace fácilmente con unas pocas líneas de Python. Pero recuerden que Python es un lenguaje interpretado y puede ser bastante lento. Aunque será difícil observar un golpe de rendimiento del ejemplo anterior, las estructuras de datos de mayor dimensión rápidamente abrumarán al Python puro.

Una vuelta alrededor de la pila de PyData
Una vuelta alrededor de la pila de PyData

Por eso numpy está implementado en gran medida en C. El código C compila a binarios nativos, específicos de la plataforma, que se ejecutan cerca del metal, eliminando los problemas de rendimiento con Python puro. Pero numpy sigue proporcionando enlaces de Python a la API implementada en C. Esto le da al desarrollador lo mejor de ambos mundos: el rendimiento de C y la facilidad de uso de Python.

La estructura central de datos de numpy es el ndarray. El “nd” significa “n-dimensional”, por lo que el ndarray es capaz de representar estructuras de datos multidimensionales. Crear un ndarray a partir de una lista de Python es simple:

123importar numpy as npdata =list(range(20))arr = np.array(data)

pitón

El alias np de numpy es una convención común. Lo verás usado en muchas aplicaciones PyData. Mostrando el valor de arr arr arribará:

1 arreglo([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19])

Esto se parece mucho a una lista de Python. Y el ndarray puede ser usado como sustituto de una lista la mayor parte del tiempo. Pero ha aprendido algunos trucos nuevos. Por ejemplo, el método de remodelación:

1mat = arr.reshape(5,4)

pitón

Esto devolverá un ndarray con las dimensiones que se le han pasado, en este caso 5 filas y 4 columnas:

12345array([[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11], [12, 13, 14, 15], [16, 17, 18, 19]])

Aunque esto parece una lista anidada en Python, en realidad es un ndarray. La indexación de un ndarray también ha aprendido algunos trucos nuevos. Por ejemplo, para acceder al valor de la fila 1 y de la columna 2, escribirías este código con listas en Python:

1mat[1][2]

pitón

Esto funciona con un ndarray también, pero hay un atajo que reduce parte del ruido sintáctico.

1mat[1,2]

pitón

Lo bueno de la indexación de ndarray es que puedes seleccionar cada valor en una dimensión con dos puntos, así:

1mat[:,2]

pitón

Esto selecciona efectivamente la columna dos en la alfombra. El colon dice que seleccione cada fila, y luego el índice dos en cada fila.

Otro beneficio del numpy es la idea de la radiodifusión . Consideremos el ejemplo obligatorio de la cuadratura de una lista de números enteros:

12345678my_list =list(range(10))squares =[]for value in my_list: sqaure_value = value **2 squares.append(square_value)# orsquares =[value **2for value in my_list]

pitón

Aunque este ejemplo puede reducirse a una sola línea de código con la comprensión de la lista, requiere cierta reflexión para traducir el código Python a la expresión matemática que representa. Usar un ndarray para hacer lo mismo es mucho más legible:

123my_array = np.array(list(range(10))square_array = my_array **2

pitón

Y escalas numéricas que se transmiten a grandes dimensiones también:

12my_array = np.random.randint(0,10, size=(3,2))square_array = my_array **2

pitón

El módulo aleatorio en numpy refleja el módulo aleatorio de la biblioteca estándar de Python con algunos extras para acomodar el ndarray. En el ejemplo anterior, randint devolverá un ndarray de 3×2 con valores enteros de 0 a 9.

Las operaciones en más de un ndarray son igual de fáciles:

123A = np.random.randint(0,10, tamaño=(3,2))B = np.random.randint(0,10, tamaño=(3,2))mat_sum = A + B

pitón

¿Y el asunto de la multiplicación de la matriz mencionado al principio de esta sección?

123A = np.random.randint(0,10, tamaño=(2,3))B = np.random.randint(0,10, tamaño=(3,4))dot_prod = A.dot(B)

pitón

Finalmente, el ndarray puede ser filtrado usando simples expresiones booleanas:

12arr = np.array(list(range(20)))odds = arr[arr %2==1]

pitón

1array([ 1, 3, 5, 7, 9, 11, 13, 15, 17, 19])

Esto sólo araña la superficie de lo entumecido. Hay muchas otras características útiles (compruebe la indexación de un ndarray) que esta guía no puede cubrir.