将高斯转换为直方图



我正在运行一个粒子模型,我希望粒子位置的初始条件模拟高斯分布。如果我在1D网格上有N数量的粒子,从-10到10,我希望它们按照已知平均值和标准偏差的高斯分布在网格上。它基本上是创建一个直方图,其中每个仓的宽度为1(位置的x轴分辨率为1(,每个仓的频率应该是其中有多少粒子,这些粒子加起来应该是N

我的策略是在x轴网格上绘制一个高斯函数,然后根据粒子数量近似每个点的值:

def gaussian(x, mu, sig):
return 1./(np.sqrt(2.*np.pi)*sig)*np.exp(-np.power((x - mu)/sig, 2.)/2)
mean = 0
sigma = 1
x_values = np.arange(-10, 10, 1)
y = gaussian(x_values, mean, sigma)

然而,我有规范化问题(总和加起来不等于N(,每个点中的粒子数应该是一个整数(我曾想过将y数组转换为整数,但由于规范化问题,我得到了一条平线(。

通常,问题是将高斯拟合到直方图,但在我的情况下,我需要做相反的操作,而且我还找不到解决方案。我将感谢任何帮助!非常感谢。

您可以使用numpy.random.normal对此分布进行采样。您可以使用以下代码获得符合高斯分布的(-10, 10)范围内的N点。

import numpy as np
import matplotlib.pyplot as plt
N = 10000
mean = 5
sigma = 3
bin_edges = np.arange(-10, 11, 1)
x_values = (bin_edges[1:] + bin_edges[:-1]) / 2

points = np.random.normal(mean, sigma, N * 10)
mask = np.logical_and(points < 10, points > -10)
points = points[mask]  # drop points outside range
points = points[:N]  # only use the first N points
y, _ = np.histogram(points, bins=bin_edges)

plt.scatter(x_values, y)
plt.show()

其想法是生成大量随机数(代码中为10N(,并忽略所需范围之外的点。

最新更新