Generating 3D Gaussian distribution in Python

前端 未结 2 1334
暗喜
暗喜 2021-02-15 18:18

I want to generate a Gaussian distribution in Python with the x and y dimensions denoting position and the z dimension denoting the magnitude of a certain quantity.

The

相关标签:
2条回答
  • 2021-02-15 18:54

    I am working on a scikit called scikit-guess that contains some fast estimation routines for non-linear fits. It has a function skg.ngauss.model (also accessible as skg.ngauss_fit.model or skg.ngauss.ngauss_fit.model) which does exactly what you want. The nice thing is that it's not a PDF, so you set the amplitude out of the box:

    import numpy as np
    import skg.ngauss
    
    a = 2e6
    mu = 0, 0
    sigma = 0.025, 0.025
    
    x = y = np.linspace(-1, 1, 31)
    
    cov = np.diag(sigma)**2
    X = np.meshgrid(x, y)
    
    data = skg.ngauss.model(X, a, mu, cov, axis=0)
    

    You need to tell it axis=0 because it automatically stacks your arrays for you. To avoid passing in that argument, you could write

    X = np.stack(np.meshgrid(x, y), axis=-1)
    

    You can plot the result:

    from matplotlib import pyplot as plt
    plt.imshow(data)
    plt.show()
    

    This is not a very exciting distribution because the spread is so small that you end up with a value of ~2e-5 just one pixel away. You may want to up your sampling space to get any sort of meaningful resolution.

    Note: At time of writing, the fitting function (ngauss_fit) is still buggy, but the model has been tested successfully, just not in the scikit.

    Disclaimer: In case it wasn't obvious from the above, I am the author of scikit-guess.

    0 讨论(0)
  • 2021-02-15 19:00

    As of scipy 0.14, you can use scipy.stats.multivariate_normal.pdf()

    import numpy as np
    from scipy.stats import multivariate_normal
    
    x, y = np.mgrid[-1.0:1.0:30j, -1.0:1.0:30j]
    # Need an (N, 2) array of (x, y) pairs.
    xy = np.column_stack([x.flat, y.flat])
    
    mu = np.array([0.0, 0.0])
    
    sigma = np.array([.025, .025])
    covariance = np.diag(sigma**2)
    
    z = multivariate_normal.pdf(xy, mean=mu, cov=covariance)
    
    # Reshape back to a (30, 30) grid.
    z = z.reshape(x.shape)
    
    0 讨论(0)
提交回复
热议问题