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

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

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

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python

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

Q&A

解決済

1回答

1479閲覧

複数のサブディレクトリ内のシリーズ画像を1つのndarrayに収める方法

windy

総合スコア3

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python

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

0グッド

0クリップ

投稿2019/08/12 06:14

編集2019/08/12 10:14

あるディレクトリ(A)に、複数のサブディレクトリ(a,b,c,d)があり、それぞれのサブディレクトリに5枚のグレースケールのシリーズ画像(1,2,3,4,5)があるとします。
以下のコードで、1つのサブディレクトリ内の画像を3次元のndarrayに収めることはできました。

python

1path = "./A/a" 2list = [] 3for root, dirs, files in os.walk(path): 4 for name in files: 5 list.append(os.path.join(root, name)) 6list.sort() 7refds = pydicom.dcmread(list[0]) 8constpixeldims = (int(refds.Rows), int(refds.Columns), len(list)) 9arraydicom = numpy.zeros(constpixeldims,dtype=refds.pixel_array.dtype) 10for namedcm in list: 11 ds = pydicom.dcmread(namedcm) 12 arraydicom[:,:,list.index(namedcm)] = ds.pixel_array

しかし、ディレクトリ内の画像をサブディレクトリ毎に4次元のndarrayに収める方法が分かりません。
aからdまでの4つのサブディレクトリ内のシリーズ画像を、順に4次元のndarrayに収めたいと考えています。

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

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

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

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

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

guest

回答1

0

ベストアンサー

下記for内でlistに入れるのではなく、辞書に{root:name}として入れる。

python

1for name in files: 2 list.append(os.path.join(root, name))

root毎に今の画像処理を行うのはどうでしょうか?(os.path.join(root, name)はそこで行う)

【追記】

python

1file_dic = {} #ファイルリストの辞書 2for root, dirs, files in os.walk(path): 3 for name in files: 4 if root in file_dic: #既にあるディレクトリにファイル名を追加 5 dic[root].append(name) 6 else: #初めてのディレクトリの場合(複数枚に対応するためリストにする) 7 dic[root] = [name] 8 9 10#取り出すとき 11for k in file_dic: #k:ディレクトリ file_dic[k]:ファイル 12 print(file_dic[k])

※上記は一例です。他にも様々な関数などもあります。

【追記】

Python

1for k in file_dic: 2 refds = pydicom.dcmread(file_dic[k][0]) 3 constpixeldims = (int(refds.Rows), int(refds.Columns), len(file_dic[k])) 4 arraydicom = numpy.zeros(constpixeldims,dtype=refds.pixel_array.dtype) 5 for namedcm in file_dict[k]: 6 ds = pydicom.dcmread(namedcm) 7 arraydicom[:,:,list.index(namedcm)] = ds.pixel_array

投稿2019/08/12 06:49

編集2019/08/14 05:33
meg_

総合スコア10580

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

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

windy

2019/08/12 11:17

“辞書に{root:name}として入れる”というのは、rootをキー、nameを値として追加するということでしょうか? 色々と調べながら辞書にする方法を試しましたが、コードをどう書いて良いのか分かりません。
windy

2019/08/14 04:21

詳細な御教授を頂き、ありがとうございます。上記の方法で、file_dicという辞書を作成することはできました。その後、辞書からキーと値を取り出して画像ファイルの3次元のndarrayを作ろうと試みましたが、どう頑張っても自分の力では作ることができませんでした。ネット上でも色々と検索しましたが、作れませんでした。その先のコードも可能でしたらご教授頂けませんでしょうか。
meg_

2019/08/14 05:39

画像処理の部分は読み込んでないので分かっていませんが、元々「list」となっていた箇所を修正しましたのでご確認ください。 ※今回に限らず注意点ですが、変数名に「list」は止めましょう。組み込み関数「list()」と名前が重複しているため「list()」が使えなくなります。
windy

2019/08/15 07:59

ありがとうございます。file_dicからキー(サブディレクトリ名)と値(画像ファイル名)を結合して取り出す部分 for namedcm in file_dict[k]: ds = pydicom.dcmread(namedcm) 上記の部分がうまくいきませんでした。何か方法はないか検討してみます。listの件、ご教授頂き、ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問