从包含复数的.txt文件中读取列数据的最佳方法是什么?

时间:2018-09-24 04:32:00

标签: python numpy scipy

我有一个如图所示的文本文件。5-column data. Colum 0,1: Position coord x,y. Column 3,4,5: Complex fields

具有近200个数据点。

如何以数组形式有效地读取它们,例如a = array([2,3,...]); d = array([4 + 5j,3 + 1j,....])?

2 个答案:

答案 0 :(得分:2)

看起来您的文本采用genfromtxt可以毫无问题地处理的格式。

暂时忽略列名称,例如,示例行为:

In [235]: txt = """-1.99 -1.99 1.07+0.165j"""

为相应的列指定dtype为浮动形式和复杂形式:

In [240]: data = np.genfromtxt([txt,txt],dtype=(float,float,complex))
In [241]: data
Out[241]: 
array([(-1.99, -1.99, 1.07+0.165j), (-1.99, -1.99, 1.07+0.165j)],
      dtype=[('f0', '<f8'), ('f1', '<f8'), ('f2', '<c16')])

结果是一个结构化数组(1d)。通过名称访问字段:

In [242]: data['f0']
Out[242]: array([-1.99, -1.99])
In [243]: data['f2']
Out[243]: array([1.07+0.165j, 1.07+0.165j])

pandas csv读取器速度更快,但只有200个数据点,我认为速度不是问题。

答案 1 :(得分:0)

使用熊猫。

如果列之间的空格是制表符,则为sep='\t',否则使用Can pandas handle variable-length whitespace as column delimiters中的解决方案

假设它是一个制表符,提取复数第三列的代码类似于

import pandas as pd

df = pd.read_csv('test.txt',sep='\t',skiprows=3)
df.columns = [f'col_{i}' for i in range(len(df.columns))]

column_2_complex_values = df.col_2.map(complex).values # this is a numpy array