python - 删除 python 中的嵌套循环

标签 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])

非常感谢您的帮助。

最佳答案

问题是分配给 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

关于python - 删除 python 中的嵌套循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18916483/

相关文章:

python - 如何使用python直接从服务器发送电子邮件而不使用smtp

python - 如何使用 BeautifulSoup 迭代站点上的多个内部链接以输出所有电子邮件地址?

Python pyodbc 返回\x0e

以相反顺序访问 numpy 数组的 Pythonic 方法

r - 使用 purrr 映射的日期嵌套循环

python - 使用 sklearn 的因子加载

python - np.float64 和 np.double 有什么区别?

python - 将 alpha 添加到 .dds 文件

html - 如何在 ASP Classic 中格式化由嵌套循环产生的嵌套表

java - 在 Java 中使用嵌套 for 循环查找概率