每行具有不同标准差的Numpy数组

5

我想要得到一个NxM矩阵,其中每行的数字都是从不同的正态分布中生成的随机样本(相同的均值但标准差不同)。以下代码可行:

import numpy as np

mean = 0.0 # same mean
stds = [1.0, 2.0, 3.0] # different stds
matrix = np.random.random((3,10))

for i,std in enumerate(stds):
     matrix[i] = np.random.normal(mean, std, matrix.shape[1])

然而,由于涉及到一个for循环,该代码并不是十分高效。有没有更快的方法来做这件事?

2个回答

4

np.random.normal()是向量化的,您可以切换轴并转置结果:

np.random.seed(444)
arr = np.random.normal(loc=0., scale=[1., 2., 3.], size=(1000, 3)).T

print(arr.mean(axis=1))
# [-0.06678394 -0.12606733 -0.04992722]
print(arr.std(axis=1))
# [0.99080274 2.03563299 3.01426507]

也就是说,scale参数是列向量的标准偏差,因此需要通过.T进行转置,因为你想要按行输入。

1
这个怎么样?
rows = 10000
stds = [1, 5, 10]

data = np.random.normal(size=(rows, len(stds)))
scaled = data * stds

print(np.std(scaled, axis=0))

输出:

[ 0.99417905  5.00908719 10.02930637]

这是利用两个正态分布可以通过线性缩放相互转换的事实。在本例中,通过乘以标准差来进行缩放。在输出中,每列(第二轴)将包含一个与stds中的值对应的正态分布变量。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接