es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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)

all_kernel

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)
Tags:  , , ,

Answer

  1. Avatar for 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ón gaussian_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):

    import numpy as np
    from scipy.stats import gaussian_kde
    
    # Crear cuadrícula de coordenadas x e y
    xmax = 4500
    ymax = 2500
    x, y = np.meshgrid(np.arange(xmax), np.arange(ymax))
    xy = np.column_stack([x.flatten(), y.flatten()])
    
    # Estimar función de densidad de kernel y extraer todos los valores
    kde = gaussian_kde(values.T)
    z = kde(xy.T)
    
    # Darle forma a los valores en una matriz
    z = z.reshape((ymax, xmax))
    

    En este ejemplo, xmax e ymax definen la forma de la matriz resultante, y creamos una malla con np.meshgrid(np.arange(xmax), np.arange(ymax)). Luego usamos np.column_stack para aplanar la cuadrícula en un arreglo de pares x, y (xy) que se puede pasar a la función kde. Los valores de densidad resultantes se almacenan en un arreglo plano z, que damos forma a la matriz deseada con z.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.

Comments are closed.