优化嵌套的for循环

时间:2016-04-16 22:19:56

标签: python numpy

我试图避免使用for循环来运行我的计算。但我不知道该怎么做。我有一个形状为w的矩阵(40,100)。每一行在t时间内保持波形的位置。例如,第一行w[0]是初始条件(由于我将展示的原因,也是w[1]。)

要为形状范围内的每个tx计算我使用的下一行元素:

w[t+1,x] = a * w[t,x] + b * ( w[t,x-1] + w[t,x+1] ) - w[t-1,x]

ab是基于等式解的一些常数(它确实无关紧要),a = 2(1-r)b=rr=(c*(dt/dx))**2 。如果c是波速且dt,则dxxt方向的增量相关。

有没有办法避免像for循环那样:

for t in range(1,nt-1):
    for x in range(1,nx-1):
      w[t+1,x] = a * w[t,x] + b * ( w[t,x-1] + w[t,x+1] ) - w[t-1,x]

ntnxw矩阵的形状。

2 个答案:

答案 0 :(得分:5)

我假设您事先设置w[:,0]w[:-1](对某些常量?)因为我没有在循环中看到它。 如果是这样,你可以消除for x循环向量化这部分代码:

for t in range(1,nt-1):
    w[t+1,1:-1] = a*w[t,1:-1] + b*(w[t,:-2] + w[t,2:]) - w[t-1,1:-1]

答案 1 :(得分:0)

不是真的。如果你想为矩阵中的每个元素(你做的)做一些事情,那么你将不得不以某种方式对每个元素进行操作(最明显的方法是使用for循环。不太明显的方法将会无论是相同还是更差)。

如果您因为循环缓慢而试图避免循环,请知道有时循环必需来解决某种问题。但是,有很多方法可以使循环更有效。

一般情况下,如果您正在查看相邻元素的矩阵问题,一个好的解决方案是使用某种动态编程或记忆(保存您的工作,这样您就不必经常重复计算) 。比如,假设您想要获取每个元素的平均值以及它周围的所有内容(这就是模糊图像的工作原理)。每个像素有8个邻居,所以平均值将是和/ 9.嗯,让我们说你保存列的总和(保存NW + W + SW,N + me + S,NE + E + SE )。那么当你转到右边的下一个时,只需将前一个中间列的值,前一个最后一列和新列的值(右边的新值)相加。您刚刚更换了添加9个数字并添加了5个。在比添加更复杂的操作中,减少9到5可能意味着性能的巨大提升。

我看着你要做的事情,我无法想出一个像我刚才描述的那样做的好方法。但看看你是否能想到类似的东西。

另外,记住乘法比加法要贵得多。因此,如果你有一个循环,例如,你必须将一些数字乘以循环变量,而不是做1x,2x,3x,......,你可以这样做(值上次+ x)。