Generating 3D Gaussian distribution in Python

前端 未结 2 1327
暗喜
暗喜 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.

提交回复
热议问题