我有一些運行緩慢的Python/Numpy代碼,我認爲這是因爲使用了double for循環。這是代碼。如何在Numpy中對這個double for循環進行矢量化?
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,u0,q,tdim):
xdim = np.size(u0)
Z = np.zeros([xdim,tdim])
Z[:,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,我搞砸了。你能幫我發現我的錯誤嗎?
當我遇到這些錯誤時,我總是試着打印一些或多或少所有東西的「len」。檢查'Z [1:,1:-1]'的長度是否正確,依此類推。 –
您是否嘗試用cProfile或其他方法來分析您的代碼?我認爲你應該首先確定你真正的瓶頸。 –
瓶頸在加熱,這佔用了程序時間的99.9%。所以是的,這是我需要優化的地方,我已經閱讀了矢量化會大大加快我的代碼。我剛剛在尺寸上偏離1:/ – Zack