Подтвердить что ты не робот

Как сгенерировать 2D-гауссовский язык с помощью Python?

Я могу генерировать гауссовские данные с помощью функции random.gauss(mu, sigma), но как я могу генерировать 2D-гауссову? Есть ли такая функция?

4b9b3361

Ответ 1

Поскольку стандартное двумерное гауссовское распределение является просто произведением двух одномерного гауссовского распределения, если между двумя осями нет корреляции (т. random.gauss Ковариантная матрица диагональна), просто вызовите random.gauss дважды.

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

Ответ 2

Если вы можете использовать numpy, есть numpy.random.multivariate_normal(mean, cov[, size]).

Например, чтобы получить 10 000 2D-образцов:

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

где mean.shape==(2,) и cov.shape==(2,2).

Ответ 3

Я хотел бы добавить приближение, используя экспоненциальные функции. Это непосредственно порождает матрицу 2d, которая содержит подвижный симметричный 2d-гауссовский.

Следует отметить, что я нашел этот код в архивах списков рассылок и немного изменил его.

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)

Для справки и улучшений он размещен как gist здесь. Приглашаем вас приветствовать!

Ответ 4

У Numpy есть функция для этого. Это документировано здесь. В дополнение к предложенному выше методу позволяет нарисовать образцы с произвольной ковариацией.

Вот небольшой пример, предполагая, что ipython -pylab запущен:

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

Ответ 5

import numpy as np

# define normalized 2D gaussian
def gaus2d(x=0, y=0, mx=0, my=0, sx=1, sy=1):
    return 1. / (2. * np.pi * sx * sy) * np.exp(-((x - mx)**2. / (2. * sx**2.) + (y - my)**2. / (2. * sy**2.)))

x = np.linspace(-5, 5)
y = np.linspace(-5, 5)
x, y = np.meshgrid(x, y) # get 2D variables instead of 1D
z = gaus2d(x, y)

Простая реализация и пример двумерной функции Гаусса. Здесь sx и sy - это спреды в направлении x и y, mx и my - координаты центра.