en_US English ja 日本語 zh_CN 中文

python3でnanが入ってるデータを取り使う場合

生データにnanが入ってるってことはそれなりによくある。

nan入っててもそのまま処理してくれたり、nan_policyとかを手動でセットすればオーケって場合は楽なんだけど、そうでない場合もあって結構めんどくさいことも。

それでどうするかっていうと、まあ状況によってnanを0にしたり、infにしたり、周りの値の平均値にしたり、含む行を削除しちゃったり、などなど。

numpyのndarrayにnanがいる場合

データは2列複数行のndarray。

isnan()でnanの場所を探して書き換える。

data[i][np.isnan(data[i])]=0
data[i][np.isnan(data[i])]=np.inf

など。

同じくisnan()で探して含む行を削除する

こうやってanyを使って抽出するってのが一番シンプル? 文字数も少ないし。

data[i]=data[i][~np.isnan(data[i]).any(axis=1)]

deleteを使って書くならこんな感じかな? データによって少し変える必要があるかもしれないが。私のは2列目にnanが入ってるのでこう書いた。

 data[i] = np.delete(data[i],np.where(np.isnan(data[i][:,1])),axis=0)

今の所はこのくらい。

pandasとか他の形式で扱うことがあったら追記する。

関連記事

1. pythonのまとめ

D

en_US English ja 日本語 zh_CN 中文

python3を使ってx軸が角度の2列xyデータで、角度をずらして取り扱う

ちょっと、いやかなりタイトルが微妙。

やりたかったことは、xyデータのx軸が0−360度のデータなんだけど、元々のデータセットだとピークが見にくいので90度ずらしたいというだけ。つまりは下図。わかりやすい日本語タイトルが思いつく人間になりたい。

プロット

データ。

1 100
2 200
3 400
4 1000
… …
360 80

てな感じの360行。

スクリプト。

filenames = tkfd.askopenfilenames(filetypes= [("all files","*"),('text','*.txt'),('text','*.dat')], initialdir='./DATA')
for i in range(len(filenames)):
  data[i] =np.loadtxt(filenames[i],comments='#',skiprows=1)
  basename[i] = os.path.basename(filenames[i]+str(i)+'.txt')
#データの並び替え。ここでは90度ずらしてるけど何度でもいい。角度を変えたらあとのfor文の長さも修正する。
  data[i][:,:]=np.vstack((data[i][90:360,:],data[i][0:90,:]))
#X軸の修正。ベターな書き方ありそう。
  for j in range(90):
    data[i][269+j,0] = 360+j
  plt.plot(data[i][:,0],data[i][:,1],'x',ms=10)
  plt.savefig('./FIGURE/HERMANS/'+'Dataprocess'+str(i)+'.png',bbox_inches='tight')

という感じ。

関連記事

1. pythonのまとめ

D

en_US English ja 日本語 zh_CN 中文

python3のmatplotlibで散布図作製

plotでプロットするだけ。特に注意事項もないので、スクリプトだけ。

#描画設定
plt.rcParams['font.family']='Arial'
plt.rcParams['font.size']= 14
plt.rcParams['axes.linewidth']=2.5
plt.rcParams['xtick.major.width']=2.5
plt.rcParams['xtick.labelsize']=14
plt.rcParams['ytick.major.width']=2.5
plt.rcParams['ytick.labelsize']=14
plt.rcParams['figure.figsize']=(4,4)
#x、y軸の値。今回は文字列に対してプロット
Title = ['x1','x2','x3','x4','x5','x6']
y1 = np.array([-0.31,0.63,0.80,0.38,-0.72,-0.69])
y2 = np.array([0.87,0.51,0.38,0.54,0.83,0.11])
y3 = np.array([0.10,0.18,-0.19,0.15,-0.16,-0.14])
#今回はsubplotで
fig, ax1 = plt.subplots()
#plotでプロット
ax1.set_ylabel('explanation of y-axis',fontname='Arial')
ax1.plot(Title,y1,marker='v',ms=11,color='orange',fillstyle='none',linestyle = 'None')
ax1.plot(Title,y2,marker='D',ms=9,color='g',fillstyle='none',linestyle = 'None')
ax1.plot(Title,y3,marker='x',ms=9,color='m',linestyle = 'None')
#軸などの微調整
ax1.tick_params(axis ='x', which ='both', top='off',bottom='off', pad=10)
plt.xticks(rotation =70)
plt.yticks([-1.0,-0.5,0,0.5,1.0])
plt.ylim(-1,1)
fig.tight_layout()
fig.savefig('FIGURE/test.png')
plt.savefig('FIGURE/'+'orig.png', bbox_inches='tight')
plt.show()
plt.clf()

という感じで、プロットはこんな感じ。

散布図

おしまい。

関連記事

1. pythonのまとめ

D

en_US English ja 日本語 zh_CN 中文

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