每行具有不同标准偏差的 Numpy 数组
Numpy array with different standard deviation per row
我想要一个 NxM
矩阵,其中每行中的数字是从不同正态分布(相同 mean
但不同标准差)生成的随机样本。以下代码有效:
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
循环。有更快的方法吗?
这个怎么样?
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
.
中的值
np.random.normal()
is vectorized;您可以切换轴并转置结果:
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
参数是 column-wise 标准偏差,因此需要通过 .T
转置,因为你想要 row-wise输入。
我想要一个 NxM
矩阵,其中每行中的数字是从不同正态分布(相同 mean
但不同标准差)生成的随机样本。以下代码有效:
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
循环。有更快的方法吗?
这个怎么样?
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
.
np.random.normal()
is vectorized;您可以切换轴并转置结果:
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
参数是 column-wise 标准偏差,因此需要通过 .T
转置,因为你想要 row-wise输入。