任务:
- 我已经运行了一个振动分子的模拟,拍摄了我的原子每0.1个fempto-second的“快照”
- 现在我需要查看输出并获取所有这些不同的笛卡尔坐标集(总共50个)。
- 几何体格式很好,但是在几何体片段之间有相同格式的额外东西(参见示例)。
示例(这是我正在尝试解析的文件中的50个相同的段之一,只有16个原子不是4.)
Time in trajectory (femtosec) 3.300000D+00
Total energy (au) -2.716055737D+02
Total angular momentum (h-bar) 5.485831060D-14
Coordinates (Bohr)
I= 1 X= -1.573316541788D+00 Y= -3.143098097327D-01 Z= -9.488852008364D-01
I= 2 X= -1.549056004901D+00 Y= -3.758762443395D-01 Z= 1.621875214114D+00
I= 3 X= 7.633881398143D-01 Y= -3.853052819189D-01 Z= 3.487630749614D-01
I= 4 X= 2.390273062744D+00 Y= 1.832192143047D+00 Z= 6.235281069720D-01
Momentum (sqrt(amu)*Bohr/sec)
I= 1 X= -3.536362458214D+13 Y= 2.431139678255D+13 Z= 1.413087646815D+13
I= 2 X= -2.526353110947D+13 Y= -2.551987667221D+12 Z= 7.250485757030D+12
I= 3 X= -1.190415840625D+13 Y= -1.311816871612D+13 Z= -4.638293368564D+12
I= 4 X= 6.566472312459D+12 Y= -2.248922363477D+13 Z= -4.123675084717D+11
我希望如果有一些方法可以循环文件并读取坐标,然后跳过动量信息,并删除所有额外信息,例如I =,X =等。
我认为如果我能将它变成3D numpy数组会很好,我的坐标将被索引:(迭代次数,原子数和x y或z坐标)。我不知道Regex在这里会有多大帮助,因为动量部分中的线条具有相同的格式。你们这些优秀的人能不能在这里向我提供正确的方向?
我非常感谢获得答案的资源我没有时间框架可以工作,所以我希望在这里学到一些东西。
答案 0 :(得分:1)
您可以使用接受生成器的numpy.genfromtxt()
,因此可以在您提供的输入中进行一些自定义。例如,我在D
取代e
并忽略以'M'
和'C'
开头的所有行。此外,我只使用包含所需数据的列(3, 5, 7)
。最后,对数组进行重新整形,以保持每个" Momentum"彼此分开并可通过第一个索引访问(假设它们总是有4行):
gen = (r.replace('D','e') for r in open('test.txt') if not r[0] in ['C','M'])
a = np.genfromtxt(gen, skip_header=3, usecols=(3, 5, 7))
a = a.reshape(-1, 4, 3)
#[[[ -1.57331654e+00 -3.14309810e-01 -9.48885201e-01]
# [ -1.54905600e+00 -3.75876244e-01 1.62187521e+00]
# [ 7.63388140e-01 -3.85305282e-01 3.48763075e-01]
# [ 2.39027306e+00 1.83219214e+00 6.23528107e-01]]
#
# [[ -3.53636246e+13 2.43113968e+13 1.41308765e+13]
# [ -2.52635311e+13 -2.55198767e+12 7.25048576e+12]
# [ -1.19041584e+13 -1.31181687e+13 -4.63829337e+12]
# [ 6.56647231e+12 -2.24892236e+13 -4.12367508e+11]]]
在此数组中,您将使用第一,第二和第三个索引访问动量I和(X,Y,Z):
a[0,1,2] #first momentum, second I and third coordinate