我有一个关于使用 Python 动态构建直方图的概念性问题。我试图弄清楚是否有一个好的算法或者可能是一个现有的包。
我编写了一个函数,它运行蒙特卡罗模拟,被调用 1,000,000,000 次,并在每次运行结束时返回一个 64 位浮点数。以下是上述功能:
def MonteCarlo(df,head,span):
# Pick initial truck
rnd_truck = np.random.randint(0,len(df))
full_length = df['length'][rnd_truck]
full_weight = df['gvw'][rnd_truck]
# Loop using other random trucks until the bridge is full
while True:
rnd_truck = np.random.randint(0,len(df))
full_length += head + df['length'][rnd_truck]
if full_length > span:
break
else:
full_weight += df['gvw'][rnd_truck]
# Return average weight per feet on the bridge
return(full_weight/span)
df
是一个 Pandas 数据框对象,其列标记为'length'
和'gvw'
,分别是卡车长度和重量。head
是两辆连续卡车之间的距离,span
是桥梁长度。只要卡车列车的总长度小于桥的长度,该功能就会将卡车随机放置在桥上。最后,计算每英尺桥上存在的卡车的平均重量(桥上存在的总重量除以桥长)。
因此,我想构建一个表格直方图,显示返回值的分布,稍后可以绘制。我有一些想法:
继续在 numpy 向量中收集返回值,然后在完成 MonteCarlo 分析后使用现有的直方图函数。这是不可行的,因为如果我的计算是正确的,我只需要 7.5 GB 的内存用于该向量(1,000,000,000 64 位浮点数 ~ 7.5 GB)
用给定的范围和箱数初始化一个 numpy 数组。在每次运行结束时将匹配箱中的项目数增加一。问题是,我不知道我会得到的值的范围。设置具有范围和适当 bin 大小的直方图是未知的。我还必须弄清楚如何将值分配给正确的垃圾箱,但我认为这是可行的。
以某种方式即时进行。每次函数返回一个数字时修改范围和 bin 大小。我认为这太棘手了,无法从头开始编写。
好吧,我敢打赌可能有更好的方法来处理这个问题。欢迎任何想法!
其次,我测试了运行上述函数 1,000,000,000 次,只是为了获得计算出的最大值(代码片段如下)。这需要大约一个小时span = 200
。如果我运行更长的跨度,计算时间会增加(while 循环运行的时间更长以用卡车填充桥梁)。你认为有没有办法优化这个?
max_w = 0
i = 1
while i < 1000000000:
if max_w < MonteCarlo(df_basic, 15., 200.):
max_w = MonteCarlo(df_basic, 15., 200.)
i += 1
print max_w
谢谢!