質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

リストボックス

ユーザーがリストから1つ以上のアイテムを選択できるようにするGUI要素です。

置換

置換とは文字列中の特定の文字に対して、別の文字列に置き換えることを指します。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

1回答

1559閲覧

下記のコードでリストの要素の置換を行うと、14時間たっても処理が終わらない

jasa

総合スコア17

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

リストボックス

ユーザーがリストから1つ以上のアイテムを選択できるようにするGUI要素です。

置換

置換とは文字列中の特定の文字に対して、別の文字列に置き換えることを指します。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

1クリップ

投稿2019/10/01 01:17

編集2019/10/01 01:34

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

上記コードの改善点か、同様の事が行える別のコードなど分かりましたら、ご教授のほど宜しくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tiitoi

2019/10/01 03:58

こういうループをゴリゴリ使うようなアルゴリズムを実装するなら、Python ではなく、C++ で実装するべきではないでしょうか。速度に数百倍の差がでます。
hayataka2049

2019/10/01 04:08

python(風)で書きたい場合はcythonを検討するといいかもしれません。
guest

回答1

0

ベストアンサー

説明文と図のイメージからコメントさせてもらいます(コードは読んでいません)

scipyにndimage.binary_fill_holesという機能があります。
これを使って以下のイメージでご希望のことはできませんか?
0. データから値が0.1かどうかの判定結果を作成する
0. dimage.binary_fill_holesで1を加工して0.1で囲まれた部分を埋めたマスクを用意する
0. 元データのうち、マスクがTrueの部分を0.1にする

python

1import numpy as np 2from scipy import ndimage 3 4# 適当に穴の空いたデータを用意 5SIZE = 15 6a = np.zeros((SIZE, SIZE)) 7a[1:5, 1:5] = 0.1 8a[2:4, 2:4] = 0 9a[5:9, 5:9] = 0.1 10a[6:8, 6:8] = 0 11a[10:11, 0:10] = 0.1 12a[9, 7] = 0.1 13print(a) 14print('-' * 100) 15 16target = (a == 0.1) # 値が0.1の部分だけを抽出 17mask = ndimage.binary_fill_holes(target) # 穴を埋めたマスクパタンを用意する 18a[mask] = 0.1 # 元データのうち、マスクの部分を0.1にする 19print(a) 20print('-' * 100)

処理イメージは、こんな感じです。

元データ [[0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. ] [0. 0.1 0.1 0.1 0.1 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. ] [0. 0.1 0. 0. 0.1 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. ] [0. 0.1 0. 0. 0.1 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. ] [0. 0.1 0.1 0.1 0.1 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. ] [0. 0. 0. 0. 0. 0.1 0.1 0.1 0.1 0. 0. 0. 0. 0. 0. ] [0. 0. 0. 0. 0. 0.1 0. 0. 0.1 0. 0. 0. 0. 0. 0. ] [0. 0. 0. 0. 0. 0.1 0. 0. 0.1 0. 0. 0. 0. 0. 0. ] [0. 0. 0. 0. 0. 0.1 0.1 0.1 0.1 0. 0. 0. 0. 0. 0. ] [0. 0. 0. 0. 0. 0. 0. 0.1 0. 0. 0. 0. 0. 0. 0. ] [0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0. 0. 0. 0. 0. ] [0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. ] [0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. ] [0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. ] [0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. ]] ---------------------------------------------------------------------------------------------------- 加工後 [[0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. ] [0. 0.1 0.1 0.1 0.1 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. ] [0. 0.1 0.1 0.1 0.1 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. ] [0. 0.1 0.1 0.1 0.1 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. ] [0. 0.1 0.1 0.1 0.1 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. ] [0. 0. 0. 0. 0. 0.1 0.1 0.1 0.1 0. 0. 0. 0. 0. 0. ] [0. 0. 0. 0. 0. 0.1 0.1 0.1 0.1 0. 0. 0. 0. 0. 0. ] [0. 0. 0. 0. 0. 0.1 0.1 0.1 0.1 0. 0. 0. 0. 0. 0. ] [0. 0. 0. 0. 0. 0.1 0.1 0.1 0.1 0. 0. 0. 0. 0. 0. ] [0. 0. 0. 0. 0. 0. 0. 0.1 0. 0. 0. 0. 0. 0. 0. ] [0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0. 0. 0. 0. 0. ] [0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. ] [0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. ] [0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. ] [0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. ]] ----------------------------------------------------------------------------------------------------

投稿2019/10/01 10:48

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jasa

2019/10/04 01:59

無事、うまくいきました。速度も早くコードも短く非常に重宝しています。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問