从文件构造结构化的numpy数组?

时间:2019-09-04 09:47:57

标签: python file numpy structured-array

我的任务是用python编写一个简单的MD仿真程序,该程序不利用python内置类型(dict,list),而仅利用numpy数组。据我了解,这可以使代码编译得更快。在代码的某一点上,我想从类似字典的对象中获取原子的质量,可以用MassDict['N'] = 14.0067之类的元素名称来切片。

根据我所读的内容,我需要使用结构化的numpy数组。我现在想做的是使用以下格式打开文件:

H 1.008
He 4.003
Li 6.941

然后构造一个结构化的numpy数组,可以使用第一列中的元素名称对其进行切片。

我尝试制作两个numpy数组,然后将它们串联,但这似乎不是我所需要的。一开始我的代码看起来不太好。那么,如何创建一个numpy对象,该对象可以通过文本文件中的字符串进行最佳切片? 这是我的代码:

import numpy as np
import re

def mass_el(file):

    with open(file) as inf:

        for i, line in enumerate(inf):
            pass

        elements = np.empty((i+1),dtype='S2')
        masses = np.empty((i+1),dtype=np.float32)


    with open(file) as inf:

        for i, line in enumerate(inf):
            elements[i] = re.search('[a-zA-Z]+',line).group()
            masses[i] = re.search('\d+[.]\d+',line).group()

    #???


mass_el('elements.txt')

1 个答案:

答案 0 :(得分:0)

使用numpy

如果文件中的数据字段定期分隔(CSV文件),则可以使用numpy loadtxt功能,该功能允许您直接从文件中读取数据并设置其格式。

m_els = np.loadtxt('elements.txt', dtype={'names':('element', 'mass'), 'formats':('U2', 'f')})

使用3行文件,您将获得以下m_els数组:

array([('H', 1.008), ('He', 4.003), ('Li', 6.941)],
    dtype=[('element', '<U2'), ('mass', '<f4')])

我想您想要的是什么。要获取元素,例如说氢,请执行m_els[0]以获取第一个元组。 m_els[0][1]得到氢质量。

使用熊猫

使用pandas更加容易,因为它是建立在numpy之上的,因此速度也很快。

import pandas as pd
m_els = pd.read_csv('elements.txt', sep='\s+', header=None, names=['element', 'mass'])

在这种情况下,m_els是一个数据帧,其中元素名称用作索引:

  element   mass
0       H  1.008
1      He  4.003
2      Li  6.941

要获取与元素相对应的行(例如氢),请执行m_els.iloc[0]。要获取氢质量,请执行m_els.loc[0, 'mass']或使用元素名称m_els['mass'].loc[m_els['element'] == 'H']