删除python中的嵌套循环

时间:2013-09-20 12:10:26

标签: python numpy nested-loops

我正在努力加快我的代码。最大的问题是我有一些嵌套循环(它们必须迭代超过25000个单元)。但是,当我试图摆脱这些嵌套循环时,我得到了不同的结果,我似乎没理由。

这是嵌套循环之一:

for i in range(N):
    for j in range(N):
        # value added in sector i (month k+1)
        VA[i,k+1]= VA[i,k+1] - IO[j,i]*(Produc[i,k+1]/Produc[i,0])

这就是我摆脱内循环所做的:

for in range(N):
    VA[i,k+1]=VA[i,k+1] - np.sum(IO[:,i])*(Produc[i,k+1]/Produc[i,0])

非常感谢你的帮助。

1 个答案:

答案 0 :(得分:1)

问题在于,分配给VA会将类型限制为VA.dtype,因此如果VA.dtype的精确度低于VA[i,k+1] - IO[j,i]*(Produc[i,k+1]/Produc[i,0])的结果,则可能会失去准确性。

为了保持这种四舍五入,你需要:

for i in range(N):
    # value added in sector i (month k+1)
    VA[i,k+1] -= (IO[:,i]*(Produc[i,k+1]/Produc[i,0])).astype(VA.dtype).sum()

...假设您对更准确的版本不满意!

一些更为艰苦的研究表明,如果减法将数据通过0,则行为不能完美模拟。我不会打扰,因为模仿微妙的错误是浪费时间;)。


请注意,如果您对

感到满意
for in range(N):
    VA[i,k+1]=VA[i,k+1] - np.sum(IO[:,i])*(Produc[i,k+1]/Produc[i,0])

你也可以

VA[:,k+1] -= IO.sum(axis=0) * Produc[:,k+1] / Produc[:,0]

我认为是等价的。


请注意,这假设N非常适合这些。可能VA[:N, :N]是VA的子集,在这种情况下,这就是问题,您应该在计算中将所有内容裁剪为N