冷めたコーヒー

Weniger, aber besser

バイナリファイルを読み込んで可視化するまでの手順(Python)

データの書き込み

ここでは,データの生成は C++ で行う.生成するデータとしては,以下の関数を用いる. $$ y = \mathrm{e}^{-x} \cos x \qquad (0 \leqq x \leqq 10)$$

以下に C++ で書いたコードを載せる.

#include <iostream>
#include <cmath>
#include <string>
#include <fstream>

// 実行する前に、dataという名前のフォルダを用意しておく
std::string filename = "result.bin"; //出力ファイル名

int main()
{
    int n = 1000;//データ数
    double y[n+10];

    for (int i=0; i<n; i++)
    {
        y[i] = std::exp((double) -i/100) * std::cos((double) i/100);
    }

    std::ofstream fout;
    fout.open( "./data/" + filename, std::ios_base::out|std::ios_base::binary|std::ios_base::trunc);

    if (!fout) //ファイルが存在しない場合の処理
    {
        std::cout << "cannot open the file" << std::endl;
        return 1;
    }

    for (int i=0; i<n; i++)//0,1,...,n-1
    {
        fout.write((char *)&y[i], sizeof(double));
    }

    fout.close();
    return 0;
}

データの読み込み

バイナリファイルの読み込みはnumpyを用いて次のように行う.

filename = "./data/result.bin" #ファイルのディレクトリを指定
x = np.arange(1000)
y = np.fromfile(filename, dtype='float64') #今回はdouble型なのでfloat64を指定

可視化

可視化に関しては好きなように記述したら良いと思うのだが,ここではmatplotlibを使った例を示す.

fig = plt.figure(figsize=(8,6)) #サイズを指定
plt.plot(x, y, label='$y=e^{-x}\cos x$', linestyle='--', color='blue') #描画
plt.grid(which='major',color='black',linestyle='-') #グリッド線の追加
plt.xlabel('$x$', fontsize=20)
plt.ylabel('$y$', fontsize=20)
# plt.title('title', fontsize=20)
plt.legend(fontsize=20)
plt.tick_params(labelsize=20)
# plt.savefig('./Image/image.png') #データの保存

出力される図の例を以下に示す.

f:id:mirucacule:20200514130442p:plain
グラフ例

おわりに

今回は C++ で生成したデータをバイナリデータとしてファイルに書き込み,そのデータを Python で読み込んで可視化することを行った.単にグラフを描くだけならば,Python で完結すればよいのだが,バイナリファイルの取り扱いを勉強したかったので,このような内容にした.なお,周囲の C / C++ ユーザに聞くと,データをテキストファイル(もしくはバイナリファイル)に書き込み,gnuplot によって可視化する場合が多いようである.

更新履歴

  • 2020.05.14:C++のコードに一部誤りが含まれていたので修正
  • 2020.05.14:データの読み込みの部分にxに関する記述がなかったので追記
  • 2020.05.14:グラフが正しく貼られていなかったため修正