如何使用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