将复杂数据读入numpy数组

218*_*218 2 python numpy

我需要从文本文件中读取复杂数字到numpy数组.我的问题类似于这个使用numpy.savetxt和numpy.loadtxt编写和读取复数,但是,这里的解决方案是改变数据保存的格式.我没有这个奢侈,因为文本文件是由生成的其他我无法改变的软件.文本文件的示例如下:

25 + 0i
8.43818 + -4.94194i
4.46817 + -5.08305i
4.55764 + -3.02201i
2.69138 + -5.43104i
-0.151334 + -4.83717i
1.98336 + -1.3339i
3.59002 + -0.932973i
1.42727 + -0.617317i
1.02005 + -1.14214i
-0.15564 + 2.74564i
Run Code Online (Sandbox Code Playgroud)

我尝试过以下方法:

np.loadtxt('file.txt',delimiter='\n',dtype=np.complex128)
Run Code Online (Sandbox Code Playgroud)

但是我得到错误:

ValueError: complex() arg is a malformed string
Run Code Online (Sandbox Code Playgroud)

我读过的帖子暗示这是+ -某些行中的符号问题,但是,即使+删除了额外的符号,我也会得到相同的错误.

aba*_*ert 5

但是,这里的解决方案是改变保存数据的格式

好消息,你不必!

numpy.loadtxt 可以采用任何可迭代的行,而不仅仅是文件对象.

因此,您可以将文件对象包装在一个简单的生成器中,该生成器可以动态地转换行,并将其提供给loadtxt,每个人都会很高兴.

像这样:

def transform_complex(line):
    # insert your code here

with open('file.txt', 'rb') as f:
    lines = map(transform_complex, f)
    arr = np.loadtxt(lines, dtype=np.complex128)
Run Code Online (Sandbox Code Playgroud)

(如果您使用的是Python 2.x,并且文件很大,您可能希望使用itertools.imap而不是map.)

"在此处插入代码"部分,您可以从有效的答案填写,但不是一个可接受的解决方案,因为它需要修改文件.由于我没有在你的链接中看到这样的答案,我不确定那是什么,但是例如,也许就是这样:

def transform_complex(line):
    return line.replace(b'+ -', b'- ')
Run Code Online (Sandbox Code Playgroud)

在本地测试一些东西,看起来你的输入实际上有三个错误.

您可以测试输出应该使用的内容savetxt.例如:

>>> arr = np.array([1-2j])
>>> f = io.BytesIO()
>>> np.savetxt(f, arr)
>>> f.getvalue()
b' (1.000000000000000000e+00-2.000000000000000000e+00j)\n'
Run Code Online (Sandbox Code Playgroud)

(在Python 2.x中,您将看不到b前缀.)

并非所有这些差异都是相关的 - 你不必使用指数表示法,你不需要parens等等 - 但看起来这三个是:

  • +在复数中不允许有空格.
  • 想象单位必须是j,而不是i.
  • 没有+-允许.

所以:

def transform_complex(line):
    return line.replace(b' ', b'').replace(b'+-', b'-').replace(b'i', b'j')
Run Code Online (Sandbox Code Playgroud)