其他分享
首页 > 其他分享> > 如何使用NumPy从文件中读取复数?

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

作者:互联网

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

# 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)

NumPy似乎很适合只用一个分隔符读取数据列,但是括号似乎破坏了使用numpy.loadtxt()的任何尝试.

有没有一种聪明的方法用Python读取文件,或者最好是只读取文件,删除所有括号,然后将其提供给NumPy?

这需要为成千上万的文件完成,所以我想要一种自动化的方式,但也许NumPy不具备此功能.

解决方法:

这是一个比@ 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 ]])

或者在熊猫中:

>>> 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)

标签:python,numpy,complex-numbers
来源: https://codeday.me/bug/20190718/1493088.html