假设我需要保存一个矩阵(每行对应一行), 以便之后可以在Fortran中加载。我应该选择哪种方法?是将所有内容转换为字符串的唯一方法吗?
假设我需要保存一个矩阵(每行对应一行), 以便之后可以在Fortran中加载。我应该选择哪种方法?是将所有内容转换为字符串的唯一方法吗?
struct
标准模块的文档,其中有一个pack
函数用于将Python对象转换为二进制数据。import struct
value = 3.141592654
data = struct.pack('d', value)
open('file.ext', 'wb').write(data)
row_data = struct.pack('d' * len(matrix_row), *matrix_row)
'd' * len(matrix_row)
是一个常数,因此您只需要计算一次该格式字符串。我不懂Fortran,所以很难说哪些解析方式对你来说更容易。
听起来你的选择要么是将double类型保存为文本(也就是将其“转换”为字符串),要么是保存为二进制(使用struct
等)。决定哪种方式更好取决于具体情况。
我会选择文本方式,因为这样文件可以轻松阅读,而且你不必处理各种细节(例如大小端字节序、默认double类型大小) 。但是,有些情况下二进制方式更好(例如,如果你有一个非常大的double列表并且空间很重要,或者如果解析更容易且你需要进行优化),但这可能不适用于你的情况。
你可以使用JSON
import json
matrix = [[2.3452452435, 3.34134], [4.5, 7.9]]
data = json.dumps(matrix)
open('file.ext', 'wb').write(data)
文件内容将会是:
[[2.3452452435, 3.3413400000000002], [4.5, 7.9000000000000004]]
如果可读性和易于访问很重要(且文件大小合理),Fortran可以轻松解析一个简单的数字数组,至少如果它事先知道矩阵的大小(使用类似READ(FILE_ID,'2(F)')的东西):
1.234 5.6789e4
3.1415 9.265358978
42 ...
在你的Python代码中,两个嵌套的for循环可以轻松地将矩阵写成这种形式。