关于numpy.random.choice生成数组不符合预期分布的咨询
关于numpy.random.choice抽样结果与预期分布偏差的问题
嘿,我来帮你搞明白这个情况~
首先得明确一个关键点:你设置的p=[0.45, 0.45, 0.10]是理论概率期望,不是说单次抽样(这里是100个元素)就一定会严格出现45、45、10次的结果。随机抽样本身就带有波动性,就像你抛10次硬币,很少会正好得到5次正面5次反面,但抛1000次的话,结果就会很接近50%的比例。你现在的样本量只有100,出现±几次的偏差完全是正常的抽样误差,比如你给出的几次结果里,30的次数在9-14之间,离10的期望值其实很近,这都是合理的波动范围。
如果你的需求是必须严格得到45次10、45次22、10次30,而不是概率抽样的话,可以换一种思路:先构造一个完全符合次数要求的数组,再打乱顺序重塑成二维数组。具体代码如下:
import numpy as np # 先构造包含指定次数的一维数组 full_arr = np.concatenate([ np.full(45, 10), # 45个10 np.full(45, 22), # 45个22 np.full(10, 30) # 10个30 ]) # 随机打乱数组顺序 np.random.shuffle(full_arr) # 重塑为10x10的二维数组 choice = full_arr.reshape(10, 10) # 验证结果 unique, counts = np.unique(choice, return_counts=True) print(dict(zip(unique, counts))) # 每次运行都会得到{10: 45, 22: 45, 30: 10}
要是你还是想保留概率抽样的逻辑,只是希望结果更接近理论期望,那可以试试增大样本量——比如生成1000x1000的数组,这时候统计结果会越来越接近你设置的0.45、0.45、0.1比例。
内容的提问来源于stack exchange,提问作者TheDoctor
相关产品推荐
相关产品推荐

