Con esta entrada voy a inaugurar una serie de entradas que serán cortas. La idea detrás de ellas sirve a dos propósitos, fundamentalmente:
- Ver pequeñas y, quizás, desconocidas funcionalidades prácticas que están dentro de bibliotecas de uso típicas (numpy, scipy, matplotlib,…),
- intentar aportar algo a Pybonacci dentro de mi apretada agenda (y que se apretará más en unos pocos meses, mi tiempo se ha reducido drásticamente en los últimos tiempos).
Y basta ya de preámbulos, que esto pretende ser corto y práctico.
Hoy vamos a ver numpy.digitize
que, como la documentación oficial indica, sirve para devolver los índices de los intervalos de datos a los que pertenece cada valor de un array de datos. Las entradas de la función son solo tres, el array en cuestión a evaluar (array), los valores que establecen los intervalos (bins) y una una palabra clave opcional que establece si los valores a tener en cuenta como extremos del intervalo incluyen el extremo derecho o el izquierdo del intervalo (el valor por defecto es right==False, lo cual indica que el intervalo no incluye el extremo derecho, es decir, tendríamos el siguiente caso, bins[i-1] <= x < bins[i]).
El uso puede ser algo tan simple como lo siguiente:
Problema: Para un grupo de datos con valor comprendido entre 0 y 1 encontrar los datos asociados a los siguientes intervalos y saber qué función hay que aplicar en cada intervalo:
f(x) = x cuando x <= 0.25
f(x) = 2x cuando 0.25 > x >= 0.7
f(x) = 3x cuando x > 0.7
Una solución sencilla usando np.digitize
podría ser la siguiente:
import numpy as np import matplotlib.pyplot as plt xarray = np.random.rand(100) intervalos = [0, 0.25, 0.7, 1] indices = np.digitize(xarray, intervalos, right=True) funcs = [lambda x: x, lambda x: 2x, lambda x: 3x] yarray = [funcsindice-1 for x, indice in zip(xarray, indices)] plt.scatter(xarray, yarray)
El resultado final debería ser una imagen como la siguiente:
Quizá lo más complicado de entender sea la línea 8 de la anterior porción de código, si no entiendes algo puedes preguntar en los comentarios.
La función numpy.digitize
podría ser similar en su uso a numpy.histogram
y a numpy.histogramdd
. En la última función se usa internamentenumpy.digitize
.
Saludos.
otra forma mas sencilla de entender seria:(a partir de la quinta linea)
funcs=np.array([lambda x:x, lambda x:2*x, lambda x:3*x])
yarray=np.array([funcs[indices][i](xarray[i]) for i in range(len(xarray))])