如何将numpy复数矩阵导出为符合要求的CSV文件?
解决NumPy复数矩阵导出CSV的格式问题
我完全懂你遇到的麻烦——用numpy.savetxt导出complex128类型的矩阵时,要么多维矩阵下格式失效,要么默认输出带括号的复数,导致Matlab无法识别。下面给你两个精准解决的方案:
方案一:动态构造格式化字符串(推荐)
问题的核心是:当矩阵有多列时,你需要为每个元素都指定复数格式,而不是给整行用单一格式。我们可以根据矩阵的列数动态生成对应的fmt参数:
import numpy as np # 示例复数矩阵(替换成你的矩阵即可) A = np.matrix([[1.23456789+9.87654321j, 2.3456789+8.7654321j], [3.456789+7.654321j, 4.56789+6.54321j]], dtype=np.complex128) # 根据列数生成每个元素的格式模板,用逗号分隔 col_num = A.shape[1] fmt = ','.join(['%.18e%+.18ej'] * col_num) # 导出CSV np.savetxt('A.out', A, fmt=fmt, delimiter=',')
这样生成的文件完全符合你的要求:每行对应矩阵一行,复数元素以6.103515626000000000e+09+1.712134684679831166e+05j的格式输出,没有括号和多余空格,Matlab可以直接读取。
方案二:手动转换为字符串数组再保存
如果觉得动态构造格式字符串不够直观,也可以先把每个复数元素手动格式化为目标字符串,再导出字符串数组:
import numpy as np A = np.matrix([[1.23456789+9.87654321j, 2.3456789+8.7654321j], [3.456789+7.654321j, 4.56789+6.54321j]], dtype=np.complex128) # 定义复数格式化函数 def format_complex(z): return f"{z.real:.18e}{z.imag:+.18e}j" # 将矩阵转换为字符串数组 str_matrix = np.vectorize(format_complex)(A) # 导出CSV np.savetxt('A.out', str_matrix, fmt='%s', delimiter=',')
这个方法对格式的控制更直接,同样能生成符合要求的文件。
补充:为什么之前的方法失效?
- 当你只用
fmt='%.18e%+.18ej'时,numpy.savetxt会把这个格式应用到整行而非单个元素,所以只有1×1矩阵有效; - 默认情况下,
numpy.savetxt处理复数时会自动添加括号(格式为(real+imagj)),这就是Matlab无法识别的原因。
内容的提问来源于stack exchange,提问作者mgus
相关产品推荐
相关产品推荐

