Я могу генерировать гауссовские данные с помощью функции random.gauss(mu, sigma)
, но как я могу генерировать 2D-гауссову? Есть ли такая функция?
Как сгенерировать 2D-гауссовский язык с помощью Python?
Ответ 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 - координаты центра.