Python 将复数的numpy矩阵导出到CSV

Python 将复数的numpy矩阵导出到CSV,python,matlab,csv,numpy,complex-numbers,Python,Matlab,Csv,Numpy,Complex Numbers,我在Python中遇到以下问题。假设具有dtype实体的numpy.matrixa为complex128。我想以CSV格式导出A,以便条目用逗号分隔,输出文件中的每一行对应一行A。我还需要18个小数点的精度,包括实部和虚部,并且条目中没有空格。例如,我需要这个 `6.103515626000000000e+09+1.712134684679831166e+05j` 而不是 `6.103515626000000000e+09 + 1.712134684679831166e+05j` 以下命令有

我在Python中遇到以下问题。假设具有
dtype
实体的
numpy.matrix
a为
complex128
。我想以CSV格式导出A,以便条目用逗号分隔,输出文件中的每一行对应一行A。我还需要18个小数点的精度,包括实部和虚部,并且条目中没有空格。例如,我需要这个

`6.103515626000000000e+09+1.712134684679831166e+05j`
而不是

`6.103515626000000000e+09 + 1.712134684679831166e+05j`
以下命令有效,但仅适用于1乘1矩阵

numpy.savetxt('A.out', A, fmt='%.18e%+.18ej', delimiter=',')
如果我使用:

numpy.savetxt('A.out', A, delimiter=',')
有两个问题。首先,我不知道默认情况下保留了多少小数点。其次,每个复杂条目都放在括号中,如

(6.1035156260000000e+09+1.7121346846679831166e+05j)

我无法在Matlab中读取该文件


您有什么建议?

这可能不是转换大型矩阵中数据的最有效方法,我相信存在一种更有效的单行代码解决方案,但您可以尝试执行下面的代码,看看它是否有效。在这里,我将使用pandas将数据保存到csv文件中。生成的csv文件中的第一列分别是实部和虚部。这里我还假设输入矩阵的维数为Nx1

import pandas as pd
import numpy as np

def to_csv(t, nr_of_decimal = 18):
    t_new = np.matrix(np.zeros((t.shape[0], 2)))
    t_new[:,:] = np.round(np.array(((str(np.array(t[:])[0][0])[1:-2]).split('+')), dtype=float), decimals=nr_of_decimal)
    (pd.DataFrame(t_new)).to_csv('out.csv', index = False, header = False)

#Assume t is your complex matrix
t = np.matrix([[6.103515626000000000e+09+1.712134684679831166e+05j], [6.103515626000000000e+09+1.712134684679831166e+05j]])    
to_csv(t)

它列出了可能的复杂格式。此
fmt=['%.18e+%.18ej']*5
适用于5列数组。换句话说,当您同时指定实部和imag部分时,您已经为所有列指定了格式。它不会为您执行复制。如果这没有帮助,您可能需要阅读
savetxt
代码,注意它如何处理复杂数组。单行的有效格式是:
,'.join(['%.18e+%.18ej']*5)%tuple(x[0]。view(float))
。也就是说,它将复杂值的元组格式化为两个浮点值。因此,无论如何,a.shape[1]*2的每一个值都必须有一个格式字符串。@hpaulj我已经尝试过你的建议,它是有效的。我现在面临的问题是,它为带有负虚部的数字打印
+-
,比如
1.000000000000000000e+00+-6.103515650000e+09j
,这些数字不能被Matlab读取。有什么解决方法吗?
genfromtxt
也无法加载该格式。也许我们需要看看Python的
%
格式选项。实际上,
savetxt
所做的一切都是对行进行迭代,并将每个行格式化为文本行。因此,在写入文本文件时,任何可以获得漂亮的
打印
行的操作都应该有效。如果目标是MATLAB,您可以尝试
scipy.io.savemat
,创建一个兼容的
.mat
文件,而不是文本。