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无法做到这一点。
这是比@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)
| 归档时间: |
|
| 查看次数: |
4835 次 |
| 最近记录: |