[英]write complex<double>'s to plain text/binary file in C++, and read them into a NumPy array
域名注册地址:
细节:
我在 C++ 代码中运行物理模拟,并在 Python 中进行数据分析。 我正在处理complex<double>
类型的数组(实际上是armadillo cx_mat
矩阵;我认为这与我的问题无关,但可能是)。
我需要将这样一个形状为Nt
行和Nx
列的数组写入一个文件,然后将其读入具有相同形状的复杂双精度数的 numpy 数组。
最小工作示例:我有以下 C++ 代码来输出数据,作为纯文本文件或二进制文件(当Nt
和Nx
变得非常大时,我需要使用二进制文件)。
//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();
我的问题:
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?
如果我写入二进制文件,如何将其读入类似的 NumPy 数组? 另外,有没有办法编写二进制文件来对行列结构进行编码? (我猜不是;如果不是,那么我的 NumPy 脚本中将有Nt
和Nx
可用)
(任何有关正确文件处理/错误检查的提示将不胜感激,尽管我的主要问题是 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.