• ベストアンサー

pythonで制作中のプログラムのエラー修繕と速度向上を行いたいのですが...

こんにちは。いつもお世話になっております。 今回、file("filename.txt", "r")で読み込んだ多次元配列の中から、数字の合計が一番大きくなる長方形を探し出して合計をprintするプログラムを作っています。なんだか分かりにくい説明ですみません...。 例えば、 0 -2 -7 0 9 2 -6 2 -4 1 -4 1 -1 8 0 -2 が読み込まれた配列だとしたら、左下の 9 2 -4 1 -1 8 を含む長方形内の数字の合計(9+2-4+1-1+8)が、この配列内の数字の合計の最大になります。この最大合計値を含む長方形を見つけ出して合計をprintさせたいのです。 自力で書いたものは以下です↓ myFile = file("matrix.txt", "r") row = 0 for line in myFile: line = line.rstrip() nums = line,split(" ") dim = len(nums) for col in range(dim): matrix[row][col] = int(nums(col))←ここでエラーが出てしまいました   row = row+1 myFile.close() sumMatrix = [[0 for j in range(dim)] for i in range(dim)] for m in range(dim): for n in range(dim): mySum = 0 for p in range(m+1): for q in range(n+1): mySum = mySum = matrix[p][q] sumMatrix[m][n] = mySum for i in range(dim): for j in range(dim): print sumMatrix[i][j], 8行目のエラーを解消させたいのと、このプログラムで配列が大きいものになると、とても遅くなってしまうようなので、もっと早いものにしたいのですが... ご回答、よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

#高速化で良く使う手段 # googleで、psycoのインストールの仕方を検索しよう import psyco psyco.full() #http://psyco.sourceforge.net/download.html # windowsだとwindows用のexeファイルをダウンロードして実行するだけ。 myFile = file("matrix.txt", "r") #最初にファイルを一気に読んでします(ファイルが大きくなければ) fcont=myFile.readlines() myFile.close() #読み込んだデータは配列fcontに押し込められているので、次の処理で読み込む for line in fcont: ___buf=line.rstrip().split("") ___matrix.append( [int(n) for n in buf] ) #次元を求める dim=len(matrix) #次の処理は numpyを使うと早くなるよ # googleで、numpyのインストールの仕方を探しましょう。 #http://sourceforge.net/project/showfiles.php?group_id=1369&package_id=175103 #windowsならば、exeファイルをダウンロードして実行するだけ from numpy import * x=zeros( (dim,dim),float) #要素が0.0のarray形式の二次元配列生成 orgmatrix=array(matrix)  #二次元配列を、array形式に直す for m in xrange(dim): ___for n in xrange(dim): ______#各要素[0][0]----[m][n]までを取り出すして、その合計値を求める ______# array形式なので若干早いはず ______#すべての要素の合計を求める ______x[m][n]=sum(orgmatrix[:m,:n]) #データをストックあるいは表示する方法は以下のように #データをバイナリ形式で保存するときは #次の用にするとよい。 #次にデータを見るときはスクリプト内に #import pickle #x=pickle.load(open("fsave.dat")) #とすると、二次元データをxに押し込め直せる import pickle fsave=open("save.dat",'w') pickle(fsave,x) #あるいは、データをそのまま表示したいのであれば msg="" for i in xrange(dim): ___for j in xrange(dim): _______msg=msg+str(x[i][j])+"\n" print msg #二次元配列のデータを見たいのであれば # matplotlibをインストールして使う #二次元配列を画像にしてくれる #http://matplotlib.sourceforge.net/ from pylab import * im = imshow(x,origin='lower' ,cmap=cm.jet,alpha=1.0 ) cset = contour(x, origin='lower' ) clabel(cset,inline=1,fmt='%5d', fontsize=10) grid(True) show()

AE3
質問者

補足

ご回答ありがとうございます。教えていただいた方法でかなり速くなりました!詳細になご説明のおかげでとてもわかりやすかったです!

その他の回答 (1)

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.1

高速化のほうはおいといて、読み込み時のエラーは > int(nums(col)) nums なんて関数もメソッドもないのに使おうとしているからですね。 読み込みのところと、それと同じサイズのものを作るのは次のようにできますよ。 matrix = [] for line in open("matrix.txt", "r"): ____#nums = line.rstrip().split(" ") ____#matrix.append( [int(n) for n in nums] ) ____#↑上2行がこう↓ ____matrix.append([int(n) for n in line.rstrip().split(" ")]) print matrix #sumMatrix = [ [0 for j in i] for i in matrix ] #↓ sumMatrix = [ [0] * len(i) for i in matrix ] print sumMatrix 読み込みのところはもう一段リスト内包に押し込められますが さすがにそれはやめておくということで。

AE3
質問者

お礼

ご回答ありがとうございます。おかげさまでエラー解消しました!教えていただいたリスト内包でプログラムもだいぶすっきりしましたし、本当に感謝しています。本当にありがとうございました。

関連するQ&A