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

pto*_*ato 17 python numpy complex-numbers

我想用来numpy.savetxt()将复数的数组保存到文本文件中.问题:

  • 如果使用默认格式字符串保存复杂数组,则会丢弃虚部.
  • 如果您使用fmt='%s',则numpy.loadtxt()除非您指定,否则无法加载它dtype=complex, converters={0: lambda s: complex(s)}.即使这样,如果阵列中有NaN,加载仍然失败.

它看起来像有人询问这多个 的numpy的邮件列表上,甚至提交了错误,但一直没有得到答复.在我自己整理东西之前,有没有一种规范的方法可以做到这一点?

Sve*_*ach 15

它更容易并保存一些临时数组,只是将数组重新解释为一个真正的数组.

保存:

numpy.savetxt('outfile.txt', array.view(float))
Run Code Online (Sandbox Code Playgroud)

加载:

array = numpy.loadtxt('outfile.txt').view(complex)
Run Code Online (Sandbox Code Playgroud)

如果您希望在文件的同一行中包含实部和虚部,则可以使用

numpy.savetxt('outfile.txt', array.view(float).reshape(-1, 2))
Run Code Online (Sandbox Code Playgroud)

要么

array = numpy.loadtxt('outfile.txt').view(complex).reshape(-1)
Run Code Online (Sandbox Code Playgroud)

分别.

(请注意,既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)
Run Code Online (Sandbox Code Playgroud)

重新整形是必要的,因为numpy.view()不在跨步阵列上操作.


pto*_*ato 5

如果有人从Google提出这个问题,这是我的解决方案。

保存:

numpy.savetxt('outfile.txt', numpy.column_stack([array.real, array.imag]))
Run Code Online (Sandbox Code Playgroud)

正在加载:

array_real, array_imag = numpy.loadtxt('outfile.txt', unpack=True)
array = array_real + 1j * array_imag
Run Code Online (Sandbox Code Playgroud)

我仍然会选择一个更好的解决方案!