質問: [((data3[line,4]-data2[line,4])-(data2[line,4]-data1[line,4]))/(2*dt)] ``` ```dvory =[((data3[line,5]-data2[line,5])-(data2[line,5]-data1[line,5]))/(2*dt)] ``` ``````np.savetxt(dvorx) ``` ```line += 1 f += 100 ``` ```f3 += 100 ``` file += 1 ### 試したこと 以前はstr()やnp.float64関係でのエラーが頻発していたので 文字型の問題かと思い、List化してから出力するようにしてから 書き込みが出来るようになりました。 ### 補足情報(言語/FW/ツール等のバージョンなど) プログラム環境 Python 3.6 Spyder 操作したいファイル名 He_re1000_vor-0100 He_re1000_vor-0200 He_re1000_vor-0300 ・・・ He_re1000_vor-10900 ※それぞれのファイル内には 点番号,座標データx,y,z,数値データ1,2,3 というデータが1,500,000行入っています。
回答: まず、`numpy.savetxt()` はファイルにデータを追記するのではなく、行列を一気にファイルに書き込みますので、ループで回すと最終結果だけが毎回上書きされてしまいます。 で、対応する方法ですが・・・、 順番に説明します。 現状のコードでは(ソースコードが崩れて記載されているので若干想定が入りますが)、`data1`,`data2`,`data3` にそれぞれ **(1,500,000 x 7)** の行列が入っているかと思います。 それを ``` for line in range(3): ``` と行ごとにループを行い、更にループ内で ``` dvorx = [((data3[line,4]-data2[line,4])-(data2[line,4]-data1[line,4]))/(2*dt)] dvory = [((data3[line,5]-data2[line,5])-(data2[line,5]-data1[line,5]))/(2*dt)] dvorz = [((data3[line,6]-data2[line,6])-(data2[line,6]-data1[line,6]))/(2*dt)] ``` と5列目(index=4),6列目(index=5),7列目(index=6)それぞれで `dvorx`,`dvory`,`dvorz` のデータを算出しているようです。 しかしながら、この部分は行列演算で使うことで、 ``` dvor = ((data3[:,4:7]-data2[:,4:7])-(data2[:,4:7]-data1[:,4:7]))/(2*dt) ``` と一行で**全データ**の計算を行うことができます。 > > `data1[:,4:7]` は行列`data1`より5列目・6列目・7列目のみを切り出した **(1,500,000 x 3)** の行列となります。 > > > その結果`dvor`には **(1,500,000 x 3)**の(結果が入った)行列を得ることができます。 よって、この行列を ``` np.savetxt("output_file.csv", dvor, delimiter=',') ``` とすることで、全結果が入ったCSVファイルを作成することができます。 **【補足】** 非常に細かい事ですが ``` for file in range(0,5): ``` は、`file` に 0,1,2,3,4 の値を順番に入れてループがまわります。 よって ``` file += 1 ``` は不要です。 > > `line += 1` も同様です。 > > >