由於我是新來numpy的,我對着實現,我寫在C++NumPy的:循環替代,優化
for(i=0;i<h;i++)
{
for(j=0;j<w;j++)
{
val=0;
for(i1=-size;i1<=size;i1++)
{
for(j1=-size;j1<=size;j1++)
{
h1=i+i1,w1=j+j1;
if (w1<=0) w1=w1+w;
if (h1<=0) h1=h1+h;
if (w1>=w) w1=w1-w;
if (h1>=h) h1=h1-h;
val=val+sqrt(pow(data[i][j][0]-data[h1][w1][0],2)
+pow(data[i][j][1]-data[h1][w1][1],2)
+pow(data[i][j][2]-data[h1][w1][2],2));
}
}
}
}
正如你看到的我基本上將歐幾里得距離[我一個特定代碼的問題, j]元素與作爲子矩陣的一部分的每個元素[i-size到i +大小] [j大小到j +大小]
如何在python中編寫代碼而無需使用循環執行某些操作對numpy數組中每個依賴於其行和列位置的元素進行操作。或者必須有某種方法來優化它。
這是我當前的實現是很喜歡很慢
for i in range(0,h):
for j in range(0,w):
for i1 in range(-window_size, window_size+1):
for j1 in range(-window_size, window_size+1):
h1=i+i1
w1=j+j1
if w1 <= 0:
w1+=w
if h1 <= 0:
h1+=h
if w1 >= w:
w1-=w
if h1 >= h:
h1-=h
val[i][j] += np.sqrt(((source_pyr_down_3_Luv[i][j][0] - source_pyr_down_3_Luv[h1][w1][0])**2)
+((source_pyr_down_3_Luv[i][j][1] - source_pyr_down_3_Luv[h1][w1][1])**2)
+((source_pyr_down_3_Luv[i][j][2] - source_pyr_down_3_Luv[h1][w1][2])**2))
它幾乎用了6分鐘,運行這段代碼。
您是否嘗試過自己什麼?你有什麼問題?代碼是什麼樣的,你得到了什麼錯誤信息?爲什麼你想避免循環? – Ben
增加了我在執行代碼,也加入解釋UR問題,使原來的問題是更詳細。 –
如果你有C++代碼,你可以用用Cython。無論如何,'pow(x,2)'在C或Python中效率都很低。只要使用'X * x' – tiago