如何在Python中根据包含笛卡尔坐标的数据集生成高斯分布噪声

1 投票
1 回答
2370 浏览
提问于 2025-04-17 22:07

我在找一个脚本(最好是Python)来生成高斯分布的噪声。我有一个包含三维空间中数据集的x、y和z坐标的三维数组。现在,我想从这个数据集中生成高斯噪声。我知道可以用“random.gauss(mu, sigma)函数”来生成点,但我不知道怎么针对三维数据来做?我需要分别对每个方向生成吗?如果是这样,最后我该怎么把它们关联起来呢?非常感谢任何帮助或提示!!

谢谢你

1 个回答

3

你的问题有点模糊。不过我们假设你有一个 Nx3 的数组,里面存的是在三维空间中(x, y, z)的位置数据,而你想在这些位置上加一些误差。

你可以使用 numpy,特别是 numpy.random.normal(loc=0.0, scale=1.0, size=None) 这个函数。你需要生成一个 size=(n,3) 的“误差”数组,然后把它加到你的位置数组上。

如果你想要各个方向的误差都一样,那么你需要满足 ⟨|δr|²⟩ = ⟨σ²⟩ = ⟨σ_x² + σ_y² + σ_z²⟩ = 3⟨σ_1²⟩,这意味着一维的方差是三维方差的三分之一,这样一来,比例参数就变成了三维标准差的 1/√3。

所以你需要:

noise_plus_signal = signal_in + \
      numpy.random.normal(scale=sigma/numpy.sqrt(3.0), size=(n,3))

或者,我可能完全误解了你的问题。

更新内容:

  • 如果数据是用球坐标表示的,可能最简单的方法是先转换成笛卡尔坐标,然后再用上面的方法。

  • 如果你想给每个点设置不同的标准差,你可以把整个随机数数组(如果按照上面的方式生成,它的大小和你的点数组是一样的)乘以另一个数组,遵循 numpy 的规则。具体来说,如果你的数组形状是 (n,3),你可以用 numpy.random.normal(scale=1,size=(n,3))*sigma_array,其中 sigma_array 的大小是 (n),这样每个点就有自己的方差,而 (x,y,z) 坐标在同一个点上会有相同的方差。

撰写回答