0

我的任务是在 python 中编写一个简单的 MD-Simulation 程序,它不使用 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')
4

1 回答 1

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']

于 2019-09-04T13:07:39.267 回答