¿Cómo realizo una convolución en python con un gaussiano de ancho variable?

Necesito realizar una convolución con un gaussiano, sin embargo, el ancho del gaussiano debe cambiar. No estoy haciendo el procesamiento de señal tradicional, sino que necesito tomar mi Función de Densidad de Probabilidad (PDF) perfecta y `` difuminarla '', según la resolución de mi equipo.

Por ejemplo, supongamos que mi PDF comienza como una función pico / delta. Voy a modelar esto como un gaussiano muy estrecho. Después de ejecutar mi equipo, se manchará de acuerdo con alguna resolución gaussiana. Puedo calcular esto usando las funciones de convolución scipy.signal.

    import numpy as np
    import matplotlib.pylab as plt

    import scipy.signal as signal
    import scipy.stats as stats

    # Create the initial function. I model a spike
    # as an arbitrarily narrow Gaussian
    mu = 1.0 # Centroid
    sig=0.001 # Width
    original_pdf = stats.norm(mu,sig)

    x = np.linspace(0.0,2.0,1000) 
    y = original_pdf.pdf(x)
    plt.plot(x,y,label='original')


    # Create the ``smearing" function to convolve with the
    # original function.
    # I use a Gaussian, centered at 0.0 (no bias) and
    # width of 0.5
    mu_conv = 0.0 # Centroid
    sigma_conv = 0.5 # Width
    convolving_term = stats.norm(mu_conv,sigma_conv)

    xconv = np.linspace(-5,5,1000)
    yconv = convolving_term.pdf(xconv)

    convolved_pdf = signal.convolve(y/y.sum(),yconv,mode='same')

    plt.plot(x,convolved_pdf,label='convolved')
    plt.ylim(0,1.2*max(convolved_pdf))
    plt.legend()
    plt.show()

Todo esto funciona sin problema. Pero ahora supongamos que mi PDF original no es un pico, sino una función más amplia. Por ejemplo, un gaussiano con sigma = 1.0. Y ahora supongamos que mi resolución en realidadvaría sobre x: en x = 0.5, la función de difuminado es un gaussiano con sigma_conv = 0.5, pero en x = 1.5, la función de difuminado es un gaussiano con sigma_conv = 1.5. Y supongamos que conozco la forma funcional de la dependencia x de mi mancha gaussiana. Ingenuo, pensé que cambiaría la línea de arriba a

    convolving_term = stats.norm(mu_conv,lambda x: 0.2*x + 0.1)

Pero eso no funciona, porque la función normal espera un valor para el ancho, no una función. En cierto sentido, necesito que mi función convolving sea una matriz 2D, donde tengo un Gaussiano de difuminado diferente para cada punto en mi PDF original, que sigue siendo una matriz 1D.

Entonces, ¿hay una manera de hacer esto con funcionesya definido en Python? Tengo un código para hacer esto que escribí yo mismo ... pero quiero asegurarme de que no solo he reinventado la rueda.

¡Gracias por adelantado!

Mate

Respuestas a la pregunta(1)

Su respuesta a la pregunta