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

Python 从文件构造结构化numpy数组?,python,file,numpy,structured-array,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数组,可以使用第一列中的元素名

我的任务是用python编写一个简单的MD模拟程序,它不使用python内置类型(dict,list),而只使用numpy数组。据我所知,这允许编译代码以更快地运行。在我的代码中的某一点上,我想从一个类似字典的对象中得到原子的质量,它可以被元素名分割,比如
MassDict['N']=14.0067

据我所知,我需要使用一个结构化的numpy数组。我现在要做的是用以下表单打开我的文件:

H 1.008
He 4.003
Li 6.941
然后构造一个结构化numpy数组,可以使用第一列中的元素名对其进行切片

我试着制作两个numpy数组,然后将它们连接起来,但这似乎不是我所需要的。我的代码一开始看起来不是很好。那么,我如何创建一个numpy对象,它可以被文本文件中的字符串最优地分割? 这是我的密码:

将numpy导入为np
进口稀土
def质量(文件):
以inf形式打开(文件):
对于i,枚举(inf)中的行:
通过
elements=np.empty((i+1),dtype='S2')
质量=np.empty((i+1),数据类型=np.float32)
以inf形式打开(文件):
对于i,枚举(inf)中的行:
元素[i]=重新搜索('[a-zA-Z]+',第行).group()
质量[i]=重新搜索('\d+[.]\d+',第行).group()
#???
mass_el('elements.txt')
使用numpy 如果文件中的数据字段定期分开(CSV文件),您可以使用该功能直接从文件中读取和格式化数据

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

array([('H', 1.008), ('He', 4.003), ('Li', 6.941)],
    dtype=[('element', '<U2'), ('mass', '<f4')])
在这种情况下,
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']

您总共有多少个条目?只有那三个?这是第一个打开的
。。。通行证
适用于。它计算行数并创建具有适当条目数目的
np.empty
数组。我在复制代码时是否弄乱了缩进?我认为数组需要向左缩进一个…但是总共有多少个?如果只有三个,则
dict
很可能比
np.ndarray
108个元素质量条目更有意义。顺便说一句,我不能使用python内置代码,因为编译器显然无法加速它们。您可能会误解使用
numpy
的原因。正确使用这些数组更快,因为它们使用编译代码。但是错误的使用(迭代)会更慢。好的代码在适当的地方使用列表和字典。
m_els['mass'][0]
获取第一个条目的质量。这看起来像是正确的结构化数组,但我不认为它比dict有什么改进。老实说,我也不这么认为,但OP明确地问了如何使用numpy来实现这一点,而不使用字典。正如我所说,我对类型转换还不熟悉(直到目前为止,我都是使用python的,我对内存分配的了解很惊讶)。所以我不知道某个对象类型是如何影响性能的,也不知道使用编译器可以如何加速性能。它是否真的没有影响,所以我可以使用dict?这取决于您如何使用这些数据结构。如果你只需要选择正确的质量几次,字典是完全好的。如果您需要进行矢量化计算(如将所有质量拾取为矢量并执行一些操作),那么最好使用numpy。将比为循环编写一个
来收集字典中的所有内容要快。
import pandas as pd
m_els = pd.read_csv('elements.txt', sep='\s+', header=None, names=['element', 'mass'])
  element   mass
0       H  1.008
1      He  4.003
2      Li  6.941