生成具有随机均匀方向和高斯分布幅度的向量
Generating a vector with with a random uniform direction and a Gaussian-distributed magnitude
我想向我拥有的列表的每个 (x,y) 点添加 2D 高斯噪声。
这就是为什么我想创建一个在 [0, 2pi) 上具有随机均匀方向和具有 N(0, \sigma^2).
的高斯分布幅度的噪声向量
如何在 Python 中生成仅指定方向和大小的矢量?
您可以生成两个向量,一个用于幅度,另一个用于相位。然后你用两者来得到你想要的。
import numpy as np
import math
sigma_squred = 0.01 # Change to whatever value you want
num_elements = 10 # Size of the vector you want
magnitude = math.sqrt(sigma_squred) * np.random.randn(num_elements)
phase = 2 * np.pi * np.random.random_sample(num_elements)
# This will give you a vector with a Gaussian magnitude and a random phase between 0 and 2PI
noise = magnitude * np.exp(1j*phase)
我发现使用单个复数向量更容易,但由于您有单独的 x 和 y 值,您可以获得 noise_x
和 noise_y
向量
noise_x = noise.real
noise_y = noise.imag
注意:我假设您可以使用 numpy 库,这会使事情变得容易得多。如果不是这种情况,您将需要一个循环来生成每个元素。要生成单个幅度样本,您可以使用 random.gauss(0, sigma)
,而 2*math.pi*random.random()
可用于生成相位样本。然后你像以前一样做一个复数,从那里你可以得到实部和虚部。
好吧,这并不难做到
n = 100
sigma = 1.0
phi = 2.0 * np.pi * np.random.random(n)
r = np.random.normal(loc=0.0, scale=sigma, size=n)
x = r*np.cos(phi)
y = r*np.sin(phi)
我想向我拥有的列表的每个 (x,y) 点添加 2D 高斯噪声。
这就是为什么我想创建一个在 [0, 2pi) 上具有随机均匀方向和具有 N(0, \sigma^2).
的高斯分布幅度的噪声向量如何在 Python 中生成仅指定方向和大小的矢量?
您可以生成两个向量,一个用于幅度,另一个用于相位。然后你用两者来得到你想要的。
import numpy as np
import math
sigma_squred = 0.01 # Change to whatever value you want
num_elements = 10 # Size of the vector you want
magnitude = math.sqrt(sigma_squred) * np.random.randn(num_elements)
phase = 2 * np.pi * np.random.random_sample(num_elements)
# This will give you a vector with a Gaussian magnitude and a random phase between 0 and 2PI
noise = magnitude * np.exp(1j*phase)
我发现使用单个复数向量更容易,但由于您有单独的 x 和 y 值,您可以获得 noise_x
和 noise_y
向量
noise_x = noise.real
noise_y = noise.imag
注意:我假设您可以使用 numpy 库,这会使事情变得容易得多。如果不是这种情况,您将需要一个循环来生成每个元素。要生成单个幅度样本,您可以使用 random.gauss(0, sigma)
,而 2*math.pi*random.random()
可用于生成相位样本。然后你像以前一样做一个复数,从那里你可以得到实部和虚部。
好吧,这并不难做到
n = 100
sigma = 1.0
phi = 2.0 * np.pi * np.random.random(n)
r = np.random.normal(loc=0.0, scale=sigma, size=n)
x = r*np.cos(phi)
y = r*np.sin(phi)