如何使用numpy.savetxt保存和加载复数数组?
我想用 numpy.savetxt()
把一个复数数组保存到文本文件里。但是遇到了一些问题:
- 如果用默认的格式保存复数数组,虚部会被丢掉。
- 如果用
fmt='%s'
,那么numpy.loadtxt()
就无法加载这个文件,除非你指定dtype=complex, converters={0: lambda s: complex(s)}
。即使这样,如果数组里有NaN(不是一个数字),加载还是会失败。
看起来有人在Numpy的邮件列表上多次询问过这个问题 , 甚至还提交了一个 bug,但没有得到回应。在我自己动手之前,有没有什么标准的方法可以解决这个问题呢?
2 个回答
6
这是我的解决方案,万一有人从谷歌搜索到这个问题的话。
保存数据的代码:
numpy.savetxt('outfile.txt', numpy.column_stack([array.real, array.imag]))
加载数据的代码:
array_real, array_imag = numpy.loadtxt('outfile.txt', unpack=True)
array = array_real + 1j * array_imag
如果有更好的解决方案,我还是会把勾勾给它哦!
20
把数组重新解释成真正的数组,这样做更简单,而且可以节省一些临时数组。
保存数据:
numpy.savetxt('outfile.txt', array.view(float))
加载数据:
array = numpy.loadtxt('outfile.txt').view(complex)
如果你想把实部和虚部放在文件的同一行,可以使用
numpy.savetxt('outfile.txt', array.view(float).reshape(-1, 2))
或者
array = numpy.loadtxt('outfile.txt').view(complex).reshape(-1)
来实现。
(注意,view()
和reshape()
都不会复制数组,它们只是用不同的方式来解释同样的数据。)
提问者的补充说明:
如果你想在同一个文件中保存多个复数数组,可以这样做:
numpy.savetxt('outfile.txt', numpy.column_stack([
array1.view(float).reshape(-1, 2),
array2.view(float).reshape(-1, 2),
]))
array1, array2 = numpy.loadtxt('outfile.txt', unpack=True).view(complex)
重新调整形状是必要的,因为numpy.view()
不适用于有步幅的数组。