python3を使って二つの複数列テキストデータを一つにまとめる

DATA1

x y z
0 100 0.5
1 158 0.3
2 204 0.6
3 255 0.4

DATA2

x y z
1.5 178 0.1
2.5 222 0.0
3.5 301 0.1
4.0 347 0.7

こんな感じの複数列データの二つのファイルをx軸に合わせて一つのファイルに合成(マージ)って、一部界隈ではやる必要があることがある。普通はx軸がこんなシンプルじゃないし、各データの信頼性やらデータポイントの数なんかを考慮しながら混ぜる必要があったりするんだけど、今回の投稿はただ単純にくっつけるだけのもの。

importはtkinter, numpyそれからmatplotlibくらい。

tkinterで2列テキストデータをnumpyのarrayに読み込み

argvでもいいし、なんだっていいけど私はtkinterを使ってる。一応ここでは二つのデータファイルだけ読み込んで混ぜる設定。たくさん一気に混ぜたいなら、全部読み込んで混ぜるデータを間違えないように気をつけて書けばいいだけ。

tk = Tk()
tk.withdraw()
print ('select a data files')
filenames = tkfd.askopenfilenames(filetypes= [('text','*.dat'),('all','*.*')], initialdir='./DATA')
tkms.showinfo('file paths are',filenames)
tk.destroy()
data = [0]*len(filenames)
Y_RAW = [0]*len(filenames)
for i in range(len(filenames)):
  data[i] = np.loadtxt(filenames[i],comments = '*',encoding='Shift-JIS',skiprows=36)

内部リンク: pythonのtkinterを使ってユーザー入力を取得する方法

concatenateでテキストデータの重ね合わせ

numpyのconcatenateを使って各列のデータをくっつける。スケールをつける必要があるなら、どっちかのデータを単純にかけるなり、合成範囲での強度平均で割ったりすればいい。端にエラーデータを含む場合なんかは、data[1][3:-3,1]なんて感じで削る。

Mergey = np.concatenate((data[0][:,1],data[1][:,1]),axis=0)
Mergex = np.concatenate((data[0][:,0],data[1][:,0]),axis=0)
Mergez = np.concatenate((data[0][:,2],data[1][:,2]),axis=0)

swapaxesを使って元のデータ形式に戻す。こんなことしないでも直接混ぜれるかもしれないけど、書いてた時には他の方法だとうまくいかなかったんだよね。

Merge = np.swapaxes(np.vstack((Mergex,Mergey,Mergez)),0,1)

2021・1月13日追記:よくよく考えないでも、この例だったらvstackで直接混ぜれるよなっていう。なにかしらconcatenate使った理由はあったと思ったんだけど、もともとのスクリプトが見つからなかったから謎。

 Merge =np.vstack((data[0],data[1]))

X軸の並びに揃えたいなんて場合はargsortでも使って……

Merge = Merge[Merge[:,0].argsort(),:]

plotするなら……

plt.plot(Merge[:,0],Merge[:,1],ls='--')
plt.show()

saveするなら……

np.savetxt('TEXT/'+'Merged.txt',Merge)

と言う感じで混ぜれる。

 

関連記事

1. pythonのまとめ

D