Comment générer 2D gaussian avec Python?

je peux générer des données gaussiennes avec random.gauss(mu, sigma) fonction, mais comment puis-je générer 2D gaussien? Est-il fonctionner comme ça?

20
demandé sur kennytm 2011-10-07 17:05:27

4 réponses

puisque la distribution gaussienne 2D standard est juste le produit de deux distribution gaussienne 1D,si il n'y a pas de corrélation entre les deux axes (c'est à dire le covariant de la matrice est diagonale), il suffit d'appeler random.gauss deux fois.

def gauss_2d(mu, sigma):
    x = random.gauss(mu, sigma)
    y = random.gauss(mu, sigma)
    return (x, y)
15
répondu kennytm 2018-07-21 14:24:44

Si vous pouvez utiliser numpy, il y a numpy.random.multivariate_normal(mean, cov[, size]).

par exemple, Pour obtenir de 10 000 2D échantillons:

np.random.multivariate_normal(mean, cov, 10000)

mean.shape==(2,) et cov.shape==(2,2).

40
répondu NPE 2011-10-07 13:45:30

j'aimerais ajouter une approximation en utilisant des fonctions exponentielles. Cela génère directement une matrice 2d qui contient un gaussien 2D mobile et symétrique.

je dois noter que j'ai trouvé ce code sur les archives de la liste de diffusion scipy et l'ai légèrement modifié.

import numpy as np

def makeGaussian(size, fwhm = 3, center=None):
    """ Make a square gaussian kernel.

    size is the length of a side of the square
    fwhm is full-width-half-maximum, which
    can be thought of as an effective radius.
    """

    x = np.arange(0, size, 1, float)
    y = x[:,np.newaxis]

    if center is None:
        x0 = y0 = size // 2
    else:
        x0 = center[0]
        y0 = center[1]

    return np.exp(-4*np.log(2) * ((x-x0)**2 + (y-y0)**2) / fwhm**2)

De référence et des améliorations, il est accueilli comme un gist ici. Les demandes de Pull sont les bienvenues!

13
répondu giessel 2013-01-25 16:17:53
ici. En plus de la méthode proposée ci-dessus, elle permet de prélever des échantillons avec covariance arbitraire.

Voici un petit exemple, en supposant que ipython -pylab démarrage:

samples = multivariate_normal([-0.5, -0.5], [[1, 0],[0, 1]], 1000)
plot(samples[:, 0], samples[:, 1], '.')

samples = multivariate_normal([0.5, 0.5], [[0.1, 0.5],[0.5, 0.6]], 1000)
plot(samples[:, 0], samples[:, 1], '.')
4
répondu Johannes 2013-11-12 09:15:03