我有一个关于用Python动态构建直方图的概念性问题。我正试图找出是否有一个好的算法或可能是一个现有的包。
我写了一个函数,它运行蒙特卡洛模拟,被调用100000000次,每次运行结束时返回一个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.5GB的内存来存储这个向量(100000000个64位浮点数~7.5GB)
初始化具有给定范围和容器数的numpy数组。每次运行结束时,将匹配bin中的项目数增加一个。问题是,我不知道我将得到的值的范围。使用范围和适当的箱子大小设置直方图是未知的。我还必须找出如何将值分配给正确的容器,但我认为这是可行的。
在飞行中做吧。每次函数返回一个数字时修改范围和bin大小。我想这太难了,不可能从头开始写。
好吧,我打赌也许有更好的方法来处理这个问题。欢迎任何意见!
在第二个注意事项上,我测试了运行上面的函数100000000次,只得到了计算出的最大值(代码片段如下)。当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
谢谢!
这里有一个可能的解决方案,固定的箱子大小,箱子的形式是[k*size,(k+1)*size[。finalizebins函数返回两个列表:一个具有bin计数(a),另一个具有bin下限(上限是通过添加binsize推导出来的)。
相关问题 更多 >
编程相关推荐