【问题标题】:Numpy array with different standard deviation per row每行具有不同标准偏差的 Numpy 数组
【发布时间】:2019-09-11 07:06:30
【问题描述】:

我想得到一个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 循环,此代码效率不高。有没有更快的方法来做到这一点?

【问题讨论】:

    标签: python numpy vectorization gaussian normal-distribution


    【解决方案1】:

    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 转置,因为您需要按行输入。

    【讨论】:

      【解决方案2】:

      这个怎么样?

      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 中的值。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-10-16
        • 1970-01-01
        • 1970-01-01
        • 2022-11-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-30
        • 2020-10-14
        相关资源
        最近更新 更多