了解scipy.stats.norm.rvs()?

时间:2017-06-09 08:10:11

标签: python

scipy.stats.norm.rvs()中,参数比例表示标准差,但在下面的代码中,sigma_list表示数组。代码实际上如何工作?

通过以下代码获得sigma_list:

sigma=0.06

mask=(x > 0.65) & (x < 0.8)

sigma_list=sigma+mask*0.03

sigma_list

y = sp.stats.norm.rvs(scale=sigma_list, size=200)

即使sigma_list和y的标准偏差也不匹配

我想知道上面的scipy模块的工作原理

抱歉,我没有提到x是0到1之间的值数组

2 个答案:

答案 0 :(得分:2)

在您的代码中,此处mask将为True或False。因此,如果您进行一些加法或减法,它将分别转换为1或0。

然后sigma_list的结果不是列表,也不是数组而是浮点值。查看documentation,您可以看到它的用法。

rvs(loc=0, scale=1, size=1, random_state=None)

如果你看code(第2771行),你有:

  

loc:array_like,可选               位置参数(默认= 0)。

     

size:int或int的元组,可选               定义随机变量的数量(默认值为1)。请注意size               必须以关键字形式给出,而不是作为位置参数。

     

random_state:无或int或np.random.RandomState实例,可选               如果是int或RandomState,则使用它来绘制随机变量。               如果为None,请依赖self.random_state。               默认值为“无”。

答案 1 :(得分:0)

首先,您应该创建一个名为x的变量。该变量的大小应为200,因为这是生成的随机变量y的大小。

import numpy as np
x = np.linspace(0, 1, 200)

然后mask选择x的每个大于0.65且小于0.8的样本。变量mask将是一个布尔向量,其大小与x相同,即200个样本。此蒙版将具有值为True或False的样本。对于满足条件(x)的数组0.65 < x < 0.8的每个样本,掩码的相应样本的值为True,否则为False。

当您将布尔值乘以数字时,布尔值表现为值为0(假)或1(真)的整数。因此,乘法mask * 0.03的结果为0.03,其中0.65 < x < 0.8,否则为0。

所以这段代码简单地做到了:

  • 对于0.65 < x < 0.8,标准偏差为0.06 + 0.03,即0.09;
  • 否则标准偏差将为0.06