Python按不同概率从两个高斯分布采样出现报错如何解决
问题原因与修复方案
错误根因
你代码的核心问题是混淆了scipy分布对象和分布生成的样本数组的区别:
norm.rvs()是生成样本的方法,执行后会直接返回numpy格式的样本数组,而非可重复调用生成样本的分布对象,因此数组不存在rvs方法,触发属性报错。- 原有代码逻辑存在冗余:你预生成的size=5的样本没有被实际使用,和你要生成100个样本的需求不匹配。
正确实现
与原有逻辑对齐的写法
from scipy.stats import norm import numpy as np # 定义两个高斯分布对象,暂不生成样本 x = [norm(0, 1), norm(10, 1)] # 按0.7、0.3的概率选择对应的分布 draw = np.random.choice([0, 1], 100, p=[0.7, 0.3]) # 对选中的分布调用rvs生成单个样本 y = [x[i].rvs() for i in draw] z = np.array(y)
性能更优的向量化实现(避免循环)
from scipy.stats import norm import numpy as np # 生成选择掩码,True对应选第一个分布,False对应选第二个 mask = np.random.choice([True, False], 100, p=[0.7, 0.3]) z = np.empty(100) z[mask] = norm.rvs(0, 1, size=mask.sum()) z[~mask] = norm.rvs(10, 1, size=(~mask).sum())
内容的提问来源于stack exchange,提问作者Nanda
相关产品推荐
相关产品推荐

