Tratamiento de arrays con NUMPY

David Cerezal Landa 5 minutos de lectura

Python tiene listas, enteros, punto flotante, etc. Para cálculo numérico necesitamos más... allí aparece Numpy. Numpy es un paquete que provee a Python arreglos multidimensionales de alta eficiencia y diseñados para cálculo científico. Contiene entre otras cosas:

  • Un gran definición de N-dimensiones array object
  • Funciones de bradcasting sofisticadas
  • Herramientas para la integración de 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 usar como un eficiente contenedor multidimensional de datos genéricos. Es muy útil a la hora de crear datos aleatorios para test. Esto permite que NumPy se integre a la perfección con una amplia variedad de bases de datos.

In [180]:
import numpy as np

1.- NUMPY, Introducción

Podemos empezar con un definición básica del array numpy. Crearemos nuestro primer array con la función np.array().

Una operación muy utilizada, ya que muchas veces no sabemos que tipo de datos estamos tratando es .shape qué nos devuelve las dimensiones del array actual.

In [181]:
a = np.array([1, 2, 3])  #  Crear 1D Numpy Array
print(type(a))            # Prints "<class 'numpy.ndarray'>"
print(a.shape)            # Prints "(3)”, 1D x 3 Len
print(a[0], a[1], a[2])   # Prints "1 2 3"

a[0] = 5                 
print(a)                  # Prints "[5, 2, 3]"
<type 'numpy.ndarray'>
(3,)
(1, 2, 3)
[5 2 3]

Array indexing. También una de las características más agradecidas es el rápido y versátil acceso a estos numpy arrays como podemos ver:

In [182]:
nums = np.array([0, 1, 2, 3, 4])
print(nums)               # prints "[0, 1, 2, 3, 4]"
print(nums[2:4])          # prints "[2, 3]"
print(nums[2:])           # prints "[2, 3, 4]"
print(nums[:2])           # prints "[0, 1]"
print(nums[:])            # prints "[0, 1, 2, 3, 4]"
print(nums[:-1])          # prints "[0, 1, 2, 3]"
nums[2:4] = [8, 9]        # Assign a new sublist to a slice
print(nums)               # Prints "[0, 1, 8, 9, 4]"

a   =  np.array([[ 1 , 2 , 3 , 4], [ 5 , 6 , 7 , 8],  [ 9 , 10 , 11 , 12]])
b = a[:2, 1:3]
print(b)
[0 1 2 3 4]
[2 3]
[2 3 4]
[0 1]
[0 1 2 3 4]
[0 1 2 3]
[0 1 8 9 4]
[[2 3]
 [6 7]]

Podemos crear arrays de varias dimensiones fácilmente, esta es una de las partes más útil, por ejemplo, para pruebas. Con las funciones como .full, .zeros o .reshape podemos crear fácilmente array multidimensionales.

In [183]:
b = np.array([[1,2,3],[4,5,6]])    # Crear 2D Numpy Array
print(b.shape)                     # Prints "(2, 3)”, 2D x 3 len
print(b[0, 0], b[0, 1], b[1, 0]) 
(2, 3)
(1, 2, 4)

2.- Operaciones básicas

Podemos encontrar múltiples de operaciones que nos pueden salvar unas cuantas líneas más de una vez. Algunos de los más utilizados son los de creación de arrays, tenemos unas cuantas operaciones que nos pueden servir.

Crear array de ceros

In [184]:
a = np.zeros((2,2))   # Create an array of all zeros
print(a) 
[[0. 0.]
 [0. 0.]]

Crear array de unos

In [185]:
b = np.ones((1,2))    # Create an array of all ones
print(b) 
[[1. 1.]]

Crear un array con el número especificado

In [186]:
c = np.full((2,2), 7)  # Create a constant array
print(c)    
[[7 7]
 [7 7]]

Crear una matriz identidad, Muy útiles para operaciones algebraicas.

In [187]:
d = np.eye(2)         # Create a 2x2 identity matrix
print(d)    
[[1. 0.]
 [0. 1.]]

Crear una matriz con randoms

In [188]:
e = np.random.random((2,2))  # Create an array filled with random values
print(e)   
[[0.38735091 0.24770567]
 [0.5100342  0.29704679]]

Matrices únicas

In [189]:
Z = np.diag(np.arange(1,5),k=-1)

También tenemos ciertas operaciones que nos pueden servir para ordenar, o chequear ciertas condiciones.

devolver al revés

In [190]:
b = np.arange(10, 20)[::-1]

Comparaciones

In [191]:
print(np.isnan(c))
[[False False]
 [False False]]

Ceros, saltos...

In [192]:
chess = np.zeros((8,8),dtype="int")
chess[0::2,0::2] = 1
chess[1::2,1::2] = 1

Sortear

In [193]:
print(np.sort(a, axis=0)[::-1])
[[0. 0.]
 [0. 0.]]

Sacar los únicos

In [194]:
Z1 = np.random.randint(0,10,10)
print(np.unique(Z1))
[0 1 3 4 8 9]

3.- Operaciones con matrices

Numpy nos ofrece una buena solución para el tratamiento de operaciones con matrices. Las más típicas como multiplicaciones, división o suma aplican con la leyes de operaciones entre matrices.

In [195]:
x = np.array([[1,2],[3,4]], dtype=np.float64)
y = np.array([[5,6],[7,8]], dtype=np.float64)

Suma

In [196]:
print(x + y)
print(np.add(x, y))
[[ 6.  8.]
 [10. 12.]]
[[ 6.  8.]
 [10. 12.]]

Resta

In [197]:
print(x - y)
print(np.subtract(x, y))
[[-4. -4.]
 [-4. -4.]]
[[-4. -4.]
 [-4. -4.]]

Multiplicación

In [198]:
print(x * y)
print(np.multiply(x, y))
[[ 5. 12.]
 [21. 32.]]
[[ 5. 12.]
 [21. 32.]]

División

In [199]:
print(x / y)
print(np.divide(x, y))
[[0.2        0.33333333]
 [0.42857143 0.5       ]]
[[0.2        0.33333333]
 [0.42857143 0.5       ]]

Raíz cuadrada

In [200]:
print(np.sqrt(x))
[[1.         1.41421356]
 [1.73205081 2.        ]]

Traspuesta

In [201]:
x = np.array([[1,2], [3,4]])
print(x.T)
[[1 3]
 [2 4]]

Pegado horizontal

In [202]:
a = np.array([[1], [2], [3]])
b = np.array([[3, 4], [5, 6], [7, 8]])
c = np.hstack((a, b))
print(c) 
[[1 3 4]
 [2 5 6]
 [3 7 8]]

Pegado vertical

In [203]:
a = np.array([1, 2, 3])
b = np.array([[4, 5, 6], [7, 8, 9]])
a = np.vstack((a, b))
print(a) 
[[1 2 3]
 [4 5 6]
 [7 8 9]]

Convertir en columna

In [204]:
np.c_[np.array([[1,2,3]]), 0, 0, np.array([[4,5,6]])]
Out[204]:
array([[1, 2, 3, 0, 0, 4, 5, 6]])

Generar un array con las tres primeras columnas de a y las tres últimas

In [205]:
b = np.hstack((a[:,:3], a[:,-3:]))
print(b)
[[1 2 3 1 2 3]
 [4 5 6 4 5 6]
 [7 8 9 7 8 9]]

Intercambiar las columnas 1 y 2

In [206]:
a[:, [1,2]] = a[:, [2,1]]
print(a)
[[1 3 2]
 [4 6 5]
 [7 9 8]]

4.- Reshapes

La función de reshape cambia las dimensiones del array, esta es una opción muy requerida cuando tenemos que tratar con matrices, si queremos hacer operaciones como multiplicaciones será muy probable que necesitemos ajustar las dimensiones de los operandos. Para ellos numpy nos ofrece una de las opciones más interesante el reshape.

Primero veamos una operaciones de consultas, que bien nos pueden servir para ver la información de los arrays.

Dimensiones

In [207]:
x3 = np.random.randint(10, size=(3, 4, 5))  # Three-dimensional array
print("x3 ndim: ", x3.ndim)
('x3 ndim: ', 3)

Shape

In [208]:
print("x3 shape:", x3.shape)
('x3 shape:', (3, 4, 5))

Size

In [209]:
print("x3 size: ", x3.size)
('x3 size: ', 60)
In [210]:
a = np.arange(6).reshape((3, 2))
print(a) # array([[0, 1], [2, 3],  [4, 5]])
[[0 1]
 [2 3]
 [4 5]]
In [211]:
a = np.arange(36)
b = a.reshape((6,6))
print(b)
    
a = np.arange(6)    
print(np.reshape(a, (2, 3))) #array([[0, 1, 2], [3, 4, 5]])
print(np.reshape(np.ravel(a), (2, 3))) # array([[0, 1, 2],[3, 4, 5]])
print(np.reshape(a, (2, 3), order='F')) # array([[0, 4, 3], [2, 1, 5]])
print(np.reshape(np.ravel(a, order='F'), (2, 3), order='F')) #array([[0, 4, 3], [2, 1, 5]])
[[ 0  1  2  3  4  5]
 [ 6  7  8  9 10 11]
 [12 13 14 15 16 17]
 [18 19 20 21 22 23]
 [24 25 26 27 28 29]
 [30 31 32 33 34 35]]
[[0 1 2]
 [3 4 5]]
[[0 1 2]
 [3 4 5]]
[[0 2 4]
 [1 3 5]]
[[0 2 4]
 [1 3 5]]
David Cerezal Landa

David Cerezal Landa

Admin del Mono al ordenador. Me fuerzo a escribir porque mi mente es demasiado volatil.

Etiquetas: , ,

Actualizado:

Comentar