多分布循环蒙特卡洛模拟:泊松计数驱动的均匀随机数数组填充问题
解决方案:基于Numpy实现随机数填充NaN数组
步骤1:初始化基础数据
先把给定的事件数数组和目标NaN数组用Numpy定义好:
import numpy as np # 5×3的A/B/C类事件数数组(每行对应一次运行) event_counts = np.array([ [1, 1, 2], [1, 2, 2], [2, 1, 4], [1, 2, 3], [0, 1, 2] ]) # 初始化5行10列的NaN数组 nan_array = np.full((5, 10), np.nan)
步骤2:定义类别对应的数值区间
明确A、B、C三类随机数的生成范围:
# 各类别对应的数值区间(左闭右闭) category_ranges = { 'A': (1, 100), 'B': (101, 200), 'C': (201, 300) }
步骤3:遍历生成随机数并填充
逐行处理,根据事件数生成对应区间的随机数,再替换NaN数组的对应位置:
for row_idx in range(event_counts.shape[0]): a_cnt, b_cnt, c_cnt = event_counts[row_idx] # 生成各类别对应的整数随机数 a_nums = np.random.randint(*category_ranges['A'], size=a_cnt) b_nums = np.random.randint(*category_ranges['B'], size=b_cnt) c_nums = np.random.randint(*category_ranges['C'], size=c_cnt) # 拼接所有随机数 combined_nums = np.concatenate([a_nums, b_nums, c_nums]) # 填充到NaN数组的对应行,替换前N个NaN(N为该行事件总数) nan_array[row_idx, :len(combined_nums)] = combined_nums
验证输出
打印最终的NaN数组,会看到每行前N个位置被随机数填充,剩余位置保持NaN(示例输出,随机数每次运行不同):
print(nan_array)
输出示例:
[[ 42. 135. 271. 219. nan nan nan nan nan nan] [ 18. 162. 194. 227. 263. nan nan nan nan nan] [ 9. 83. 117. 205. 249. 272. 295. nan nan nan] [ 51. 123. 181. 208. 259. 284. nan nan nan nan] [141. 230. 268. nan nan nan nan nan nan nan]]
补充说明
- 如果需要生成浮点数随机数,把
np.random.randint替换为np.random.uniform即可 - 由于每行最大事件数为7(第三行2+1+4),小于NaN数组的10列长度,不会出现索引越界问题
内容的提问来源于stack exchange,提问作者Tim Starr
相关产品推荐
相关产品推荐

