Frage Wie generiere ich 2D Gauß mit Python?


Ich kann mit Gaußsche Daten erzeugen random.gauss(mu, sigma) Funktion, aber wie kann ich 2D Gauß erzeugen? Gibt es irgendeine Funktion?


18
2017-10-07 13:05


Ursprung


Antworten:


Da die Standard-2D-Gauß-Verteilung nur das Produkt zweier 1D-Gauß-Verteilungen ist, wenn keine Korrelation zwischen den beiden Achsen besteht (d. h. die kovariante Matrix ist diagonal), rufen Sie einfach an random.gauss zweimal.

def gauss_2d(mu, sigma):
    x = random.gauss(mu, sigma)
    y = random.gauss(mu, sigma)
    return (x, y)

15
2017-10-07 13:13



Wenn Sie es benutzen können numpy, es gibt numpy.random.multivariate_normal(mean, cov[, size]).

Um beispielsweise 10.000 2D-Stichproben zu erhalten:

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

woher mean.shape==(2,) und cov.shape==(2,2).


38
2017-10-07 13:07



Ich möchte eine Approximation mit Exponentialfunktionen hinzufügen. Dies erzeugt direkt eine 2d-Matrix, die ein bewegliches, symmetrisches 2d-Gauß-Signal enthält.

Ich sollte beachten, dass ich diesen Code auf den scipy Mailinglistenarchiven gefunden und ein wenig modifiziert habe.

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)

Als Referenz und Verbesserungen wird es als ein Kern gehostet Hier. Pull-Anfragen willkommen!


12
2018-01-25 16:17



Numpy hat eine Funktion, dies zu tun. Es ist dokumentiert Hier. Zusätzlich zu der oben vorgeschlagenen Methode erlaubt es, Proben mit beliebiger Kovarianz zu zeichnen.

Hier ist ein kleines Beispiel, angenommen ipython -pylab ist gestartet:

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], '.')

3
2018-01-23 19:27