我必须使用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
答案 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.loadtxt
或np.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]])