我的任务是用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')
答案 0 :(得分:0)
如果文件中的数据字段定期分隔(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']
。