Generar matriz de densidad de núcleo sobre todas las extensiones.
Me gustaría extraer todos los valores de una función de densidad de núcleo a una matriz (un arreglo numpy con forma ymax, xmax). Es muy fácil graficar la densidad de núcleo con seaborn:
import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns
import stats, random
x = random.sample(range(2000, 4500), 1000)
y = random.sample(range(0, 2500), 1000)
sns.kdeplot(x,y)
Y también es bastante fácil extraer los valores de densidad en posiciones específicas:
values = np.array(list(zip(x, y)))
kernel = stats.gaussian_kde(values.T)
# Extrayendo el valor del núcleo en [x_coords], [y_coords]
kernel([[2500,3700,4500],[500,2000,2500]])
array([3.09998436e-07, 4.63280866e-07, 1.56687705e-09])
La pregunta es, ¿cómo puedo extraer todos los valores posibles en una matriz (dada una extensión)? Quiero hacer cálculos de matriz con eso. Si intento usar el método anterior y le doy las coordenadas de cada píxel, simplemente es lento.
# Rápido (extrayendo el valor de densidad del núcleo en cada 100 puntos xy)
kernel(np.array(list(
itertools.product(
range(0,1000,100),
range(0,1000,100))
)).T)
# Lento (extrayendo el valor de densidad del núcleo en todos los puntos xy posibles)
kernel(np.array(list(
itertools.product(
range(0,1000),
range(0,1000))
)).T)
davy.ai
Para extraer todos los posibles valores de una función de densidad de kernel en una matriz, podemos usar la función
meshgrid
de NumPy para crear una cuadrícula de coordenadas x e y dentro de la extensión deseada. Luego podemos aplanar la cuadrícula en un arreglo de pares de coordenadas y pasarlo a la funcióngaussian_kde
para obtener un arreglo plano de valores de densidad estimados. Finalmente, podemos darle forma a este arreglo en una matriz con la forma deseada.Aquí hay un ejemplo de código que extrae todos los valores de densidad de kernel en una matriz con forma
(ymax, xmax)
:En este ejemplo,
xmax
eymax
definen la forma de la matriz resultante, y creamos una malla connp.meshgrid(np.arange(xmax), np.arange(ymax))
. Luego usamosnp.column_stack
para aplanar la cuadrícula en un arreglo de pares x, y (xy
) que se puede pasar a la funciónkde
. Los valores de densidad resultantes se almacenan en un arreglo planoz
, que damos forma a la matriz deseada conz.reshape((ymax, xmax))
.Ten en cuenta que este método será más lento que simplemente extraer valores en un subconjunto de coordenadas, pero es necesario si necesitas obtener valores en todas las coordenadas posibles.