如何在文件中保存复杂矩阵?

时间:2014-01-09 05:47:45

标签: python numpy

我必须使用numpy的savetxt命令将带有复杂数据的矩阵保存到扩展名为.H的文件中,但是我无法保存它。要保存的矩阵是

[[   1.0+0.j    0.0+0.j    0.0+0.j]
 [   1.0+0.j    1.0+0.j    0.0+0.j]
 [   2.0+0.j    2.0+0.j    0.0+0.j]
 ..., 
 [ 683.0+0.j  688.0+0.j   -2.7+0.j]
 [ 684.0+0.j  689.0+0.j   -2.7+0.j]
 [ 685.0+0.j  690.0+0.j   -2.7+0.j]]

我试过这个命令,但是给出了错误

>>savetxt('H.H',H_new.H,fmt='%.4e%+.4j%.4e%+.4j%.4e%+.4j',delimiter=' ');
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.7/dist-packages/numpy/lib/npyio.py", line 974, in savetxt
    % fmt)
AttributeError: fmt has wrong number of % formats.  %.4e%+.4j%.4e%+.4j%.4e%+.4j

1 个答案:

答案 0 :(得分:2)

您的格式字符串缺少某些格式字符。尝试像

这样的东西
fmt='%.4e%+.4ej %.4e%+.4ej %.4e%+.4ej'

但看起来你需要numpy 1.7.0或更高版本;见https://github.com/numpy/numpy/commit/1475319160baed782daa39e0de0c0655c2abe4b5

它适用于numpy 1.8.0,但不适用于1.6.1。

使用numpy 1.6.1,您可以首先创建复杂数据的真实视图,以此格式保存数据。

在这个例子中(ipython会话),我正在使用numpy 1.6.1:

In [28]: np.__version__
Out[28]: '1.6.1'

z是一个复杂的数组,形状为(2,3):

In [29]: z
Out[29]: 
array([[ 1.+2.j, -3.+4.j,  5.-6.j],
       [-1.+0.j,  0.+2.j,  3.+0.j]])

使用view方法创建一个形状为(2,6)的实数数组:

In [30]: rz = z.view(float)

In [31]: rz
Out[31]: 
array([[ 1.,  2., -3.,  4.,  5., -6.],
       [-1.,  0.,  0.,  2.,  3.,  0.]])

使用savetxt保存数组。格式字符串使用整行,因此无需提供delimiter参数:

In [32]: savetxt('z.txt', rz, fmt='%.4e%+.4ej %.4e%+.4ej %.4e%+.4ej')

看看输出:

In [33]: !cat z.txt
1.0000e+00+2.0000e+00j -3.0000e+00+4.0000e+00j 5.0000e+00-6.0000e+00j
-1.0000e+00+0.0000e+00j 0.0000e+00+2.0000e+00j 3.0000e+00+0.0000e+00j

可以使用np.loadtxtnp.genfromtxt将此文件读回到numpy数组中。要使用loadtxt,必须告知数据类型很复杂:

In [8]: loadtxt('z.txt', dtype=np.complex128)
Out[8]: 
array([[ 1.+2.j, -3.+4.j,  5.-6.j],
       [-1.+0.j,  0.+2.j,  3.+0.j]])

genfromtxt使用相同的参数。 genfromtxt也可以通过给出参数dtype=None来尝试自己确定数据类型。这适用于复杂的值:

In [9]: genfromtxt('z.txt', dtype=None)
Out[9]: 
array([[ 1.+2.j, -3.+4.j,  5.-6.j],
       [-1.+0.j,  0.+2.j,  3.+0.j]])