Python

Python numpyでのファイルの保存

numpyで計算してるんですけど、途中の計算結果をファイルに書き出したりするのが大変です。
なにかいい方法ありませんか?
numpyの計算であればnumpyのsave機能をつかって.npyファイルに書き出すのが一番ラクだよ。

numpyのarrayファイルの保存 .npyで保存する

numpyを使用していると計算途中でファイルを保存したくなることがあります。

そのときに便利なのが

「npy形式ファイルでの保存」
です。

numpyのarrayファイルは
np.save(‘ファイル名’, arrayデータ)
で保存できる (np:numpy)
※形式はバイナリ

例を示して説明します。

適当な行列を定義します。

import numpy as np

mat = np.array([[1,2,3], [4,5,6], [7,8,9]]) 
print(mat)
# [[1 2 3]
#  [4 5 6]
#  [7 8 9]]

np.save(‘matrix’, mat)

作業用フォルダに
‘matrix.npy’
というファイルが作成されます。
ここにarrayデータが保存されています。

デフォルトは.npyという形式で保存されます。

このファイルはバイナリファイルといって2進法で書かれているのでテキストではよめません。
無理に開くとこんな感じになります。

matrix.npyをテキストで開く

データを読み出す時には同様にnumpyを使います。
numpy.load
を使用して読み出せます。


read_mat = np.load('matrix.npy')
print(read_mat)
# [[1 2 3]
#  [4 5 6]
#  [7 8 9]]

無事保存されていた行列の情報がとりだせました。

テキスト形式でnumpyのarrayファイルを保存する

テキスト形式の保存は
np.savetxt(‘ファイル名’, arrayデータ, delimiter=’区切り記号’, fmt=’表示形式’)
緑字はオプション

表示形式fmtは
%.5e : 指数表記 小数点以下5桁
%.3f : 小数表記 小数点以下3桁
%i :整数表記     など

テキストで保存したい時は
np.savetxtを用います。

‘matrix.txt’というファイルに保存されます。
このファイルは普通のテキストファイルのように開けます。

np.savetxt('matrix.txt', mat)
matrix.txt

1.000000000000000000e+00 2.000000000000000000e+00 3.000000000000000000e+00
4.000000000000000000e+00 5.000000000000000000e+00 6.000000000000000000e+00
7.000000000000000000e+00 8.000000000000000000e+00 9.000000000000000000e+00

デフォルトは指数表記で小数点以下18桁です。 0が多いですね。
この表記方法は調整できます。

フォーマットの調整

fmtのオプションで設定します。

小数点以下の桁数を3桁にします

np.savetxt('matrix.txt',mat, fmt='%.3e')
matrix.txt

1.000e+00 2.000e+00 3.000e+00
4.000e+00 5.000e+00 6.000e+00
7.000e+00 8.000e+00 9.000e+00

指数表記ではなく、ただの小数点表記にします。ここでは小数点以下2桁に指定します。

np.savetxt('matrix.txt',mat, fmt='%.2f')  
matrix.txt

1.00 2.00 3.00
4.00 5.00 6.00
7.00 8.00 9.00

整数表記にします。

np.savetxt('matrix.txt',mat, fmt='%i') 
matrix.txt

1 2 3
4 5 6
7 8 9

区切り記号の調整

基本はスペース区切りになります。

delimiter
のパラメータをセットしてやるとカンマ区切りなどにもできます。

np.savetxt('matrix.csv',mat, delimiter=',', fmt='%i')
matrix.csv

1,2,3
4,5,6
7,8,9

こうしておくとエクセルでも開けますね。

タブ区切りで保存する

np.savetxt('matrix.tsv',mat, delimiter='\t', fmt='%i') 
matrix.tsv


これらのファイルを読み込む時はload.txtを使用します。

read_mat = np.loadtxt('matrix.txt')
print(read_mat)
# [[1. 2. 3.]
#  [4. 5. 6.]
#  [7. 8. 9.]]

loadtxtはデフォルトではスペース区切りのテキストを読み込むので、
カンマ区切りだとエラーになります。

read_mat = np.loadtxt('matrix.csv')

ValueError: could not convert string to float: ‘1,2,3’

read_mat = np.loadtxt('matrix.csv', delimiter=',')
print(read_mat)
# [[1. 2. 3.]
#  [4. 5. 6.]
#  [7. 8. 9.]]

具体的な使い方 点群を可視化する

私はよく点群を表記するときに使っています。
点群とは座標のx, y, zの点の集まりです。
point cloudと呼ばれることもあります。

例えば

「半径10の球の点群」

を書くとします。

半径rの球の座標は

\(x = r \sin \theta \cos \phi\)
\(y = r \sin \theta \sin \phi\)
\(z = r \cos \theta\)

で表されます。

半径10の球の点のリストを作成し、
numpyのsavetxt機能を使用して保存します。

point_list = []
r = 10   #半径を10に設定

for i in range(360): 
    i = i * np.pi / 180   #ラジアン表記にする
    for j in range(360): 
        j = j * np.pi / 180  #ラジアン表記にする
        point = np.array([r * np.sin(i) * np.cos(j), r * np.sin(i) * np.sin(j), r * np.cos(i)])
        #座標点を追加していく
        point_list.append(point) 

point_list = np.array([point_list])
# numpyのarray形式に変換
np.savetxt('sphere.asc', point_list) 
# スペース区切りで保存

ここではソフトウェアMeshLabで開ける形式の
「.asc」
ファイルで保存します。

Meshlabは使用しやすい無料の立体画像ビューアです。

=> Meshlabについてのリンク

 

保存されたsphere.ascを開きます。

sphere.asc




-1.393811151659258007e-01 -1.050312038411272964e-01 9.998476951563912252e+00
-1.375268394889459234e-01 -1.074477429516097621e-01 9.998476951563912252e+00
-1.356306718044052173e-01 -1.098315524387196429e-01 9.998476951563912252e+00
-1.336931897033491745e-01 -1.121819061709943971e-01 9.998476951563912252e+00
-1.317149833615944288e-01 -1.144980882079190410e-01 9.998476951563912252e+00
-1.296966553599560867e-01 -1.167793930180075768e-01 9.998476951563912252e+00
-1.276388205006953880e-01 -1.190251256937154556e-01 9.998476951563912252e+00
-1.255421056202451202e-01 -1.212346021631148102e-01 9.998476951563912252e+00
-1.234071493982692863e-01 -1.234071493982692586e-01 9.998476951563912252e+00
-1.212346021631148518e-01 -1.255421056202450647e-01 9.998476951563912252e+00
-1.190251256937155527e-01 -1.276388205006953047e-01 9.998476951563912252e+00
-1.167793930180076184e-01 -1.296966553599560312e-01 9.998476951563912252e+00
-1.144980882079190826e-01 -1.317149833615943733e-01 9.998476951563912252e+00
-1.121819061709944526e-01 -1.336931897033491468e-01 9.998476951563912252e+00
-1.098315524387195596e-01 -1.356306718044052728e-01 9.998476951563912252e+00


座標点が延々と保存されています。

この.ascファイルは無料ソフトMeshLabで開くことができます。

ファイルから「import mesh」を選択します。

.ascファイルを選択します。

点群が細かく描かれていることがわかります。

私自身は手術前に骨を切る線(面)を計算したり、骨格の形態計測をした結果を確認するのに使用しています。

この.ascファイルは
360×360行あるので
9.9MBもあります。

ちなみに点群を保存するのであれば(可視化しないのであれば)

np.save(‘sphere.npy’, sphere)
でnpyファイルにバイナリ形式で保存するとデータは1/3くらいに抑えられます。