在Python中将数据列读入数组

时间:2016-07-07 22:25:34

标签: python arrays list

我是Python新手。我使用Fortran生成我想要阅读的数据文件。出于多种原因,我想使用python来计算数据的平均值和统计数据而不是fortan。

我需要将前三行中的条目作为字符串读取,然后将从第四行开始的数据作为数字读取。我不需要第一列,但我确实需要其余列作为它们自己的数组。

count

数据持续数千,有时数百万行。

我尝试了以下方法,但遇到了问题,因为我无法分析我所做的列表,而且我似乎无法将它们转换为数组。然而,我宁愿只是创建数组,但如果我可以将我的列表转换为可以工作的数组。在我的方法中,当我尝试在其中一个列表中使用元素时,我得到一个错误,即Energy(i)

# Instantaneous properties
# MC_STEP              Density          Pressure      Energy_Total
#                  (molec/A^3)             (bar)      (kJ/mol)-Ext
       0    0.34130959E-01    0.52255964E+05    0.26562549E+04
      10    0.34130959E-01    0.52174646E+05    0.25835710E+04
      20    0.34130959E-01    0.52050492E+05    0.25278775E+04

我感谢任何帮助!

3 个答案:

答案 0 :(得分:2)

我会使用pandas模块执行此任务:

import pandas as pd

In [9]: df = pd.read_csv('a.csv', delim_whitespace=True, 
                         comment='#', skiprows=3,header=None,
                         names=['MC_STEP','Density','Pressure','Energy_Total'])

数据框:

In [10]: df
Out[10]:
   MC_STEP   Density   Pressure  Energy_Total
0        0  0.034131  52255.964     2656.2549
1       10  0.034131  52174.646     2583.5710
2       20  0.034131  52050.492     2527.8775

所有列的平均值:

In [11]: df.mean()
Out[11]:
MC_STEP            10.000000
Density             0.034131
Pressure        52160.367333
Energy_Total     2589.234467
dtype: float64

答案 1 :(得分:2)

您可以将Python中的list视为其他语言中的array,并且它已经过优化。如果您有一些特殊需求,可以使用但很少使用的数组类型,或者用于科学计算的numpy.array;你必须为此安装Numpy包。

在执行计算之前,将字符串转换为浮点数,例如energy.append(float(row[3]))

也许可以使用map函数立即执行此操作:

row = map(float, line.split())

最后,正如@Hamms所说,使用方括号e = energy[i]

访问元素

答案 2 :(得分:2)

您还可以使用csv模块的DictReader将每一行读入字典,如下所示:

with open('filename', 'r') as f:
    reader = csv.DictReader(f, delimiter=r'\s+', fieldnames=('MC_STEP', 'DENSITY', 'PRESSURE', 'ENERGY_TOTAL')
    for row in reader:
        Density.append(float(row['DENSITY'])
        Pressure.append(float(row['PRESSURE'])
        Energy.append(float(row['ENERGY_TOTAL'])

当然,这假定文件的格式更像是CSV(即没有注释)。如果文件顶部有注释,则可以在初始化DictReader之前跳过它们,如下所示:

next(f)