質問するログイン新規登録
Python

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

Q&A

解決済

2回答

220閲覧

入力データの並び順を変えたときに、エラーになります

yyicp

総合スコア89

Python

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

1グッド

1クリップ

投稿2025/09/16 02:45

編集2025/09/16 04:52

1

1

実現したいこと

n=4.txtは以下のようなファイルです。

0 0 1 6 0 1 1 2 0 1 2 5

n=5.txtは以下のようなファイルです。

1 1 0 13 1 1 2 8

各塊は、
x座標
y座標
z座標

の順番に並んでいます。「該当のソースコード1」は問題なく回ります。

今、仮に各塊が
y座標
z座標
x座標

の順番に並んでいる場合、「該当のソースコード1」の16~18行目を

i = int(blk[1]) j = int(blk[2]) k = int(blk[0])

に直し、
31~33行目を

pages= nx[1] rows = nx[2] cols = nx[0]

に直しただけではうまく回りませんでした(該当のソースコード2)。どなたか該当のソースコード2の間違いを正してください。

なお、各塊が
y座標
z座標
x座標

の順番に並んでいる場合は、n=4.txtは以下のように修正して、n=42.txtとしています。

0 1 0 6 1 1 0 2 1 2 0 5

同様にn=5.txtは以下のように修正して、n=52.txtとしています。

1 0 1 13 1 2 1 8

該当のソースコード1、該当のソースコード2でAの要素値を表示したとき、表示される要素の順番が違うと思います。

発生している問題・エラーメッセージ

Traceback (most recent call last): File "〇〇〇l\testCV635teratailFail.py", line 37, in <module> A = getA() File "〇〇〇\testCV635teratailFail.py", line 20, in getA dr[i][j][k]= blk[3] ~~^^^ IndexError: index 2 is out of bounds for axis 0 with size 2

該当のソースコード1(エラーなく回ります)

python

1import numpy as np 2import pandas as pd 3from glob import glob 4 5nx = [0 for i in range(3)] 6 7def getA(): 8 for f in data_files: 9 # 4行ごとに読み込み(空行はスキップされる) 10 blks = [blk.to_numpy() for blk in pd.read_csv(f, header=None, chunksize=4)] 11 12 for l, blk in enumerate(blks): 13 # 2番目以降のブロックでは空行を入れる 14 if l > 0: print('') 15 16 i = int(blk[0]) 17 j = int(blk[1]) 18 k = int(blk[2]) 19 20 dr[i][j][k]= blk[3] 21 A = dr.flatten() 22 23 return A 24 25data_files = glob('n=*.txt') 26 27nx[0] = 2 28nx[1] = 2 29nx[2] = 3 30 31pages= nx[0] 32rows = nx[1] 33cols = nx[2] 34dr = np.arange(pages*rows*cols,dtype=np.float32).reshape(pages,rows,cols) 35dr[...] = 0 36 37A = getA() 38print(A) #[ 0. 6. 0. 0. 2. 5. 0. 0. 0. 13. 0. 8.] 39 40filenamecsv = 'A.csv' 41np.savetxt(filenamecsv, A, delimiter=",")

該当のソースコード2( 発生している問題・エラーメッセージが表示されます)

python

1import numpy as np 2import pandas as pd 3from glob import glob 4 5nx = [0 for i in range(3)] 6 7def getA(): 8 for f in data_files: 9 # 4行ごとに読み込み(空行はスキップされる) 10 blks = [blk.to_numpy() for blk in pd.read_csv(f, header=None, chunksize=4)] 11 12 for l, blk in enumerate(blks): 13 # 2番目以降のブロックでは空行を入れる 14 if l > 0: print('') 15 16 i = int(blk[1]) #####ここが違う 17 j = int(blk[2]) #####ここが違う 18 k = int(blk[0]) #####ここが違う 19 20 dr[i][j][k]= blk[3] 21 22 A = dr.flatten() 23 24 return A 25 26data_files = glob('n=*.txt') 27 28nx[0] = 2 29nx[1] = 2 30nx[2] = 3 31 32pages= nx[1] #####ここが違う 33rows = nx[2] #####ここが違う 34cols = nx[0] #####ここが違う 35dr = np.arange(pages*rows*cols,dtype=np.float32).reshape(pages,rows,cols) 36dr[...] = 0 37 38A = getA() 39print(A) 40 41filenamecsv = 'A.csv' 42np.savetxt(filenamecsv, A, delimiter=",")

試したこと

IndexErrorなので、31~33行目の

pages= nx[1] rows = nx[2] cols = nx[0]

が間違っているとは思うのですが、16~18行目を

i = int(blk[0]) j = int(blk[1]) k = int(blk[2])

から

i = int(blk[1]) j = int(blk[2]) k = int(blk[0])

に直しているので、31~33行目も

pages= nx[1] rows = nx[2] cols = nx[0]

に直すのではないかと思っているのですが、よく分かりませんでした。

melian👍を押しています

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

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

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

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

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

melian

2025/09/16 04:29

n=52.txt の7行目が2になっていて、プログラムでは nx[1] = 2 (pages が 2)としているのでインデックスエラーが発生しています。とりあえず、nx[1] = 3 とすればエラーは発生しません。(根本的に対処するにはプログラムを全体的に書き換える必要がありそうです)
melian

2025/09/16 04:36 編集

書き忘れましたが、22行目で for i, blk in enumerate(blks) として変数 i を使用しているのに、for ループ内で i = int(blk[1]) としているので i の値を変更してしまっています。今回の場合は問題にはなりませんが、潜在的なバグになるので変数名を変更する方がよいかと思います。
yyicp

2025/09/16 04:53

>melian様 コメントありがとうございました。 27~29行目を nx[2] = 2 nx[0] = 2 nx[1] = 3 にすれば解決することが分かりましたが、自信がないので nx=(2,3,4)のときでもう一度確認してみます。 iが同じである件、最初に出てくるiをlに変更しました。
bsdfan

2025/09/17 02:24

解決されたようですが、 > y座標 > z座標 > x座標 だったら、 i = int(blk[2]) j = int(blk[0]) k = int(blk[1]) になるんじゃないでしょうか。 nx の方は変更しないでいいはず。(ファイルの記録形式が変わっただけで、データ構造は変わっていないので)
yyicp

2025/09/17 05:07

>bsdfan様 コメントありがとうございます。 できました。 z座標 x座標 y座標 のときでも確認しました。 お手数ですが、回答欄へのご記入をお願いします。
guest

回答2

0

解決済みですが、現状のコードの問題点について、コメントから転記します。

今、仮に各塊が
y座標
z座標
x座標

の順番に並んでいる場合

blk の中で y(j), z(k), x(i) の順に並んでいるので、

python

1i = int(blk[2]) 2j = int(blk[0]) 3k = int(blk[1])

が正しいと思われます。

また、今回の場合、ファイルの記録形式(入力部分)が変わっただけで、データ構造は変わっていない(と思われる)ので、nx の方は変更する必要はないです。

投稿2025/09/17 05:49

bsdfan

総合スコア4947

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

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

yyicp

2025/09/17 06:10

できました。 どうもありがとうございました。
guest

0

ベストアンサー

質問にあるコードでは pages, rows, cols の値を予め設定していますが、以下のコードでは自動的に決定しています。そのため出力結果には違いがありますが参考にしてみてください。

python

1import numpy as np 2import pandas as pd 3from glob import glob 4 5data_files = glob('n=*2.txt') 6# 座標値 y, z, x を x, y, z へ整列 7blks = np.concatenate([np.loadtxt(f).reshape(-1, 4)[:, [1, 2, 0, 3]] for f in data_files]) 8# x, y, z座標値を抽出(int型にキャスト) 9coords = blks[:,:3].astype(int) 10# x, y, z座標列の最大値を抽出(0-base index なので +1 しておく) 11pages, rows, cols = np.max(coords, axis=0).astype(int) + 1 12# zero fill された ndarray を用意 13dr = np.zeros((pages, rows, cols)) 14# dr[x, y, z] = value 15for i, blk in enumerate(blks): 16 dr[*coords[i]] = blk[3] 17 18A = dr.flatten() 19print(f'{A = }') 20filenamecsv = 'A.csv' 21np.savetxt(filenamecsv, A, delimiter=",", fmt='%f') 22 23# A = array([ 0., 0., 0., 13., 6., 2., 0., 0., 0., 5., 0., 8.])

投稿2025/09/16 09:07

melian

総合スコア21462

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

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

yyicp

2025/09/17 01:09 編集

コメント欄の、2025/09/16 13:53のコメントの後、 うまく行かず、進んでいなかったです。 できました。 どうもありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問