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?
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)
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)
où mean.shape==(2,)
et cov.shape==(2,2)
.
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!
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], '.')