如何为np.random.choice设置大数值范围的分段概率分布?
解决方案
直接给np.random.choice传入0-65535的完整数组并手动设置对应概率,要么会因为概率数组长度匹配问题报错,要么在更大范围场景下浪费内存。这里给两种高效的实现方式:
方法一:分区间生成(推荐)
先随机选择要生成的数所属的区间,再在对应区间内生成整数,完全不用构建大尺寸的概率数组,效率拉满:
import numpy as np # 要生成的随机数数量 sample_count = 1000 # 先选区间:0代表0-999,1代表1000-65535,对应概率0.4和0.6 interval_choices = np.random.choice([0, 1], size=sample_count, p=[0.4, 0.6]) # 根据区间生成对应随机数 result = np.where( interval_choices == 0, np.random.randint(0, 1000, size=sample_count), np.random.randint(1000, 65536, size=sample_count) )
方法二:构建匹配的概率数组(不推荐大场景)
如果一定要用np.random.choice的完整参数逻辑,需要保证概率数组长度和目标数值范围一致,且总概率和为1:
import numpy as np sample_count = 1000 total_numbers = 65536 low_range_len = 1000 high_range_len = total_numbers - low_range_len # 初始化概率数组 prob_array = np.zeros(total_numbers) # 给0-999的每个数分配相等概率,总概率0.4 prob_array[:low_range_len] = 0.4 / low_range_len # 给1000-65535的每个数分配相等概率,总概率0.6 prob_array[low_range_len:] = 0.6 / high_range_len # 生成随机数 result = np.random.choice(np.arange(total_numbers), size=sample_count, p=prob_array)
为什么直接传范围会失败?
你之前尝试的方式大概率是没处理好概率数组的长度和总和:np.random.choice要求p参数的长度必须和输入的数值数组一致,且所有概率值的总和必须严格等于1(允许微小浮点误差)。如果直接给前1000个数设0.4、后面设0.6,总概率会远大于1,自然会报错。
内容的提问来源于stack exchange,提问作者Vahid Heidaripour
相关产品推荐
相关产品推荐

