Cálculos con Arrays 1. Ufuncs
Los Loops son Lentooosss¶
import numpy as np
np.random.seed(0)
def compute_reciprocals(values):
output = np.empty(len(values))
for i in range(len(values)):
output[i] = 1.0 / values[i]
return output
values = np.random.randint(1, 10, size=5)
compute_reciprocals(values)
big_array = np.random.randint(1, 100, size=1000000)
%timeit compute_reciprocals(big_array)
UFuncs¶
Operaciones vectorizadas
print(compute_reciprocals(values))
print(1.0 / values)
%timeit (1.0 / big_array)
np.arange(5) / np.arange(1, 6)
x = np.arange(9).reshape((3, 3))
2 ** x
Cálculos usando vectorizacion a través de ufuncs son en general más eficientes que la implementación usando loops
Exploración de UFuncs¶
Ufuncs:
- unary ufuncs, operan sobre una sola entrada
- binary ufuncs, operan sobre dos entradas.
Aritmética de Array¶
Las operaciones aritméticas de adición, substracción, multiplicación y división standard:
x = np.arange(4)
print("x =", x)
print("x + 5 =", x + 5)
print("x - 5 =", x - 5)
print("x * 2 =", x * 2)
print("x / 2 =", x / 2)
print("x // 2 =", x // 2) # floor division
Negation, operador de exponencia **
y operador de módulo %
:
print("-x = ", -x)
print("x ** 2 = ", x ** 2)
print("x % 2 = ", x % 2)
Orden standard de las operaciones:
-(0.5*x + 1) ** 2
El operador +
es un wrapper para la función add
:
np.add(x, 2)
The siguiente tabla enlista los operadores aritméticos implementados en NumPy:
Operator | Equivalent ufunc | Description |
---|---|---|
+ |
np.add |
Addition (e.g., 1 + 1 = 2 ) |
- |
np.subtract |
Subtraction (e.g., 3 - 2 = 1 ) |
- |
np.negative |
Unary negation (e.g., -2 ) |
* |
np.multiply |
Multiplication (e.g., 2 * 3 = 6 ) |
/ |
np.divide |
Division (e.g., 3 / 2 = 1.5 ) |
// |
np.floor_divide |
Floor division (e.g., 3 // 2 = 1 ) |
** |
np.power |
Exponentiation (e.g., 2 ** 3 = 8 ) |
% |
np.mod |
Modulus/remainder (e.g., 9 % 4 = 1 ) |
Adicionalmente, hay operadores Boolean; exploraremos éstos en Comparaciones, mascaras y logica booleana.
Valor Absoluto¶
# Python abs
x = np.array([-2, -1, 0, 1, 2])
abs(x)
np.absolute(x)
np.abs(x)
Esta ufunc puede operar sobre números complejos:
x = np.array([3 - 4j, 4 - 3j, 2 + 0j, 0 + 1j])
np.abs(x)
Funciones Trigonometricas¶
theta = np.linspace(0, np.pi, 3)
print("theta = ", theta)
print("sin(theta) = ", np.sin(theta))
print("cos(theta) = ", np.cos(theta))
print("tan(theta) = ", np.tan(theta))
x = [-1, 0, 1]
print("x = ", x)
print("arcsin(x) = ", np.arcsin(x))
print("arccos(x) = ", np.arccos(x))
print("arctan(x) = ", np.arctan(x))
Exponentes y Logaritmos¶
x = [1, 2, 3]
print("x =", x)
print("e^x =", np.exp(x))
print("2^x =", np.exp2(x))
print("3^x =", np.power(3, x))
x = [1, 2, 4, 10]
print("x =", x)
print("ln(x) =", np.log(x))
print("log2(x) =", np.log2(x))
print("log10(x) =", np.log10(x))
# for small input
x = [0, 0.001, 0.01, 0.1]
print("exp(x) - 1 =", np.expm1(x))
print("log(1 + x) =", np.log1p(x))
Ufuncs especializadas¶
from scipy import special
# Gamma functions (generalized factorials) and related functions
x = [1, 5, 10]
print("gamma(x) =", special.gamma(x))
print("ln|gamma(x)| =", special.gammaln(x))
print("beta(x, 2) =", special.beta(x, 2))
# Error function (integral of Gaussian)
# its complement, and its inverse
x = np.array([0, 0.3, 0.7, 1.0])
print("erf(x) =", special.erf(x))
print("erfc(x) =", special.erfc(x))
print("erfinv(x) =", special.erfinv(x))
Propiedades Avanzadas de Ufunc¶
Especificando la salida¶
Todas las ufuncs pueden usar el argumento out
para indicar donde asignar el resultado
x = np.arange(5)
y = np.empty(5)
np.multiply(x, 10, out=y)
print(y)
y = np.zeros(10)
np.power(2, x, out=y[::2])
print(y)
# lo mismo pero crea un array temporal para guardar el resultado de 2**x,
# seguido de una segunda operacion que copia esos valores a y
# que puede ser costoso para arrays grandes
y = np.zeros(10)
y[::2] = 2**x
Agregaciones¶
x = np.arange(1, 6)
np.add.reduce(x)
np.multiply.reduce(x)
np.add.accumulate(x)
np.multiply.accumulate(x)
Exploraremos un poco mas en Agregaciones: Min, Max, etc..
Productos exteriores¶
x = np.arange(1, 6)
np.multiply.outer(x, x)
Otros métodos se exploran en Más índices,asi como la habilidad de operar entre arrays de distintos tamaños y formas, llamado broadcasting, que se ve en Calculos con Arrays 2. Broadcasting.