加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python – 如何在Numpy中向量化这个double for循环?

发布时间:2020-12-20 13:30:43 所属栏目:Python 来源:网络整理
导读:我有一些运行缓慢的 Python / Numpy代码,我认为这是因为使用了双循环.这是代码. def heat(D,u0,q,tdim): xdim = np.size(u0) Z = np.zeros([xdim,tdim]) Z[:,0]=u0; for i in range(1,tdim): for j in range (1,xdim-1): Z[j,i]=Z[j,i-1]+D*q*(Z[j-1,i-1]-2*
我有一些运行缓慢的 Python / Numpy代码,我认为这是因为使用了双循环.这是代码.

def heat(D,u0,q,tdim):
    xdim = np.size(u0)
    Z = np.zeros([xdim,tdim])
    Z[:,0]=u0;
    for i in range(1,tdim):
        for j in range (1,xdim-1):
            Z[j,i]=Z[j,i-1]+D*q*(Z[j-1,i-1]-2*Z[j,i-1]+Z[j+1,i-1])
    return Z

我试图删除双循环和矢量化Z.这是我的尝试.

def heat(D,0]=u0;
    Z[1:,1:-1]=Z[1:-1,:-1]+D*q*(Z[:-2,:-1]-2*Z[1:-1,:-1]+Z[2:,:-1])
    return Z

这不起作用 – 我收到以下错误:

operands could not be broadcast together with shapes (24,73) (23,74)

所以在试图对Z进行矢量化时,我搞砸了.你能帮我看看我的错误吗?

解决方法

您无法在问题的时间维度中对扩散计算进行矢量化,这仍然需要循环.这里唯一明显的优化是通过调用numpy.diff函数(预编译的C)替换拉普拉斯算法,因此您的热方程求解器变为:

def heat(D,tdim): 
    xdim = np.size(u0) 
    Z = np.zeros([xdim,tdim]) 
    Z[:,0]=u0; 

    for i in range(1,tdim): 
        Z[1:-1,i]=Z[1:-1,i-1] + D*q*np.diff(Z[:,i-1],2)

    return Z

对于非平凡的空间大小,您应该看到相当快的速度.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读