如何使用numpy.savetxt保存和加载复数数组?

22 投票
2 回答
21210 浏览
提问于 2025-04-16 20:22

我想用 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()不适用于有步幅的数组。

撰写回答