繁体   English   中英

写复杂<double>到 C++ 中的纯文本/二进制文件,并将它们读入 NumPy 数组

[英]write complex<double>'s to plain text/binary file in C++, and read them into a NumPy array

域名注册地址:

  1. 如何将 (Re, Im) 元组(按行和列排列)的纯文本文件读入复数的 NumPy 数组,尊重文本文件的行列结构?
  2. 如果可能的话,我如何对用 C++ 编写并读入 NumPy 数组的二进制文件执行相同的操作?

细节:

我在 C++ 代码中运行物理模拟,并在 Python 中进行数据分析。 我正在处理complex<double>类型的数组(实际上是armadillo cx_mat矩阵;我认为这与我的问题无关,但可能是)。

我需要将这样一个形状为Nt行和Nx列的数组写入一个文件,然后将其读入具有相同形状的复杂双精度数的 numpy 数组。

最小工作示例:我有以下 C++ 代码来输出数据,作为纯文本文件或二进制文件(当NtNx变得非常大时,我需要使用二进制文件)。

  //data is in my_cx_double_arr
  
  //write data to plain txt file                                                                                                                                                              
  ofstream txt_fout_stream("txt_output.txt" , ios::out | ios::app);
  txt_fout_stream << scientific;
  txt_fout_stream.precision(12);
  for(int i=0; i<Nt; i++){
    for(int j=0; j<Nx; j++){
      txt_fout_stream << my_cx_double_arr(i,j) << " ";
    }
    txt_fout_stream << endl;
  }
  txt_fout_stream.close();

  //write data to binary file                                                                                                                                                                 
  ofstream bin_fout_stream("bin_output.bin", ios::out | ios::app | ios::binary);
  for(int i=0; i<Nt; i++){
    for(int j=0; j<Nx; j++){
      bin_fout_stream.write(reinterpret_cast<char*>( &my_cx_double_arr(i,j) ) , sizeof(complex<double>));
      }
    }
  bin_fout_stream.close();

我的问题:

  1. txt_output.txt被格式化为正确形状的元组数组,例如:
(5.610842645053e-02,-5.700807222085e-01) (-1.198577806951e+00,9.814201723115e-01) 
(5.016283876502e-01,-1.965153563607e-01) (-2.629706723344e-01,1.228331874675e+00) 
(-2.431860857327e-01,-3.638485210072e-01) (-3.030812460688e-01,7.194149378419e-01) 

我如何将其读入复数的 NumPy 数组,每个元组读入 z=(Re,Im),并且该数组具有与文本文件中相同的Nt行和Nx cols?

  1. 如果我写入二进制文件,如何将其读入类似的 NumPy 数组? 另外,有没有办法编写二进制文件来对行列结构进行编码? (我猜不是;如果不是,那么我的 NumPy 脚本中将有NtNx可用)

  2. (任何有关正确文件处理/错误检查的提示将不胜感激,尽管我的主要问题是 1. 和 2。)

我确定之前已经回答过这个问题,如果有的话,很抱歉。 (我已经搜索过,但搜索这个问题会受到许多混淆因素的影响,例如“复杂”与“复杂”同义!)

附录:我知道写入/读取二进制文件取决于平台。 我将在同一台机器上写作和阅读,但我有兴趣学习如何解决这个问题,尽管这不是我的主要问题。 同样,我没有包含任何文件的错误处理,但想了解一旦主要问题得到解决,好的做法是什么!

好的,看起来 2. 的答案非常简单。

import numpy as np

fname = open('bin_output.bin')
data_in = np.fromfile( fname, dtype=np.complex_, count =-1)
fname.close()
data_reshaped = np.reshape(data_in, (Nt,Nx))

data_reshaped中的数字与人类可读文件txt_output.txt的数字完全匹配。

然而,这似乎不是 1 的答案。应用于txt_output.txt的相同方法给出了一个完全不同形状的数组data_in ,并且具有与实际不同的数字(具有截然不同的数量级)在文件txt_output.txt

奇怪!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM