如何使用NumPy从文件中读取复数?

f4h*_*4hy 4 python numpy complex-numbers

我需要读取以下格式的复数列:

# index; (real part, imaginary part); (real part, imaginary part) 

  1              (1.2, 0.16)                  (2.8, 1.1)
  2              (2.85, 6.9)                  (5.8, 2.2)
Run Code Online (Sandbox Code Playgroud)

NumPy看起来非常适合仅使用单个定界符读取数据列,但是括号似乎破坏了任何使用的尝试numpy.loadtxt()

是否有聪明的方法可以使用Python读取文件,还是最好只读取文件,删除所有括号,然后将其输入NumPy?

这将需要处理成千上万个文件,所以我想采用一种自动化的方式,但也许NumPy无法做到这一点。

Dou*_*gal 5

这是比@Jeff回答更直接的方法,告诉loadtxt它使用parse_pair映射(1.2,0.16)到的辅助函数将其直接加载到复杂数组中1.20+0.16j

>>> import re
>>> import numpy as np

>>> pair = re.compile(r'\(([^,\)]+),([^,\)]+)\)')
>>> def parse_pair(s):
...    return complex(*map(float, pair.match(s).groups()))

>>> s = '''1 (1.2,0.16) (2.8,1.1)
2 (2.85,6.9) (5.8,2.2)'''
>>> from cStringIO import StringIO
>>> f = StringIO(s)

>>> np.loadtxt(f, delimiter=' ', dtype=np.complex,
...            converters={1: parse_pair, 2: parse_pair})
array([[ 1.00+0.j  ,  1.20+0.16j,  2.80+1.1j ],
       [ 2.00+0.j  ,  2.85+6.9j ,  5.80+2.2j ]])
Run Code Online (Sandbox Code Playgroud)

或在大熊猫中:

>>> import pandas as pd
>>> f.seek(0)
>>> pd.read_csv(f, delimiter=' ', index_col=0, names=['a', 'b'],
...             converters={1: parse_pair, 2: parse_pair})
             a           b
1  (1.2+0.16j)  (2.8+1.1j)
2  (2.85+6.9j)  (5.8+2.2j)
Run Code Online (Sandbox Code Playgroud)