2次元配列(リスト) m1=[][]について、m1=[y][x]とするとyのインデックスは約2000個、xのインデックスは約4000個あります。この中の要素において、0.1が連続している塊が3つ存在しています。この時0.1で囲まれた領域の要素を全て0.1に置換したいです。
絵に例えた概略図
下記の様にコードを書いたのですが、ハイスペックノートPCで14時間たっても処理が終わりません。
python
1#0.1で構成される形の外周を検出 2#横に走査した時のxとyを格納(つまり高さ方向の辺の座標を格納) 3#右から走査したものは偶数番目、左から走査したものは奇数番目に格納 4contoxbre=[] 5contoybre=[] 6#縦に走査したxとyを格納(つまり横方向の辺の座標を格納) 7#上から走査したものは偶数番目、下から走査したものは奇数番目に格納 8contoxlen=[] 9contoylen=[] 10 11 12#nは0.1で構成されている形の数(ここではn=3とする) 13n=3 14 15#0.1で構成されている形のおおよその中心位置[n=1のx座標,n=1のy座標,n=2のx座標,n=2のy座標,…] 16dn=[3000,1000,2000,1000,1000,1000] 17 18 19for i in range(n): 20 #各nについてx方向に走査していく範囲(raf:前側、rar:後ろ側) 21 raf=[dn[2*(i+1)]-500,(dn[2*(i+1)]+dn[2*(i+2)])/2] 22 rar=[dn[2*(i+1)]+500,(dn[2*(i+1)]+dn[2*i])/2] 23 #各nについてy方向に走査していく範囲(d[2*i+1]-400:上側,d[2*i+1]+400:下側(下側の方が数字が大きい)) 24 for k in range(d[2*i+1]-400,d[2*i+1]+400): 25 #x方向について左から右へ走査 26 for j in range(max(raf),min(rar)): 27 if m1[k][j]==0.1: 28 contoxbre.append(j) 29 contoybre.append(k) 30 #y方向について右から左へ走査 31 for h in range(max(raf),min(rar))[::-1]: 32 if m1[k][h]==0.1: 33 contoxbre.append(h) 34 contoybre.append(k) 35 #上下についても同様に 36 for j in range(max(raf),min(rar)): 37 for k in range(d[2*i+1]-400,d[2*i+1]+400): 38 if m1[k][j]==0.1: 39 contoxlen.append(j) 40 contoylen.append(k) 41 for h in range(d[2*i+1]-400,d[2*i+1]+400)[::-1]: 42 if m1[h][j]==0.1: 43 contoxlen.append(j) 44 contoylen.append(h) 45 46#外周で囲まれた内側の領域について、左から右へ走査して0.1以外のものがあり、なおかつこれが、contoxlenに含まれているとき、これを0.1に変える 47for k in range(int(len(contoybre)/2)): 48 for h in range(int(len(contoxbre)/2)): 49 for j in range(contoxbre[2*h],contoxbre[2*h+1]): 50 if m1[contoybre[2*k]][j]!=0.1: 51 if j in contoxlen: 52 m1[contoybre[2*k]][j]=0.1 53
上記コードの改善点か、同様の事が行える別のコードなど分かりましたら、ご教授のほど宜しくお願い致します。
回答1件
あなたの回答
tips
プレビュー