Выборочный анализ большого файла данных

Задача:

-Я запустил симуляцию вибрации молекулы, делая "снимок" того, где мои атомы находятся каждые 0,1 фемтосекунды

-Теперь мне нужно пройти через вывод и взять все эти различные наборы декартовых координат (всего 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= и т. Д.

Я подумал, что было бы здорово, если бы я мог сделать это в трехмерном массиве, где мои координаты будут индексироваться с помощью: (номер итерации, номер атома и координата x y или z). Я не знаю, поможет ли Regex здесь, так как линии в импульсных секциях имеют одинаковое форматирование. Кто-нибудь из вас, замечательные люди, сможет предложить мне толчок в правильном направлении?

Буду признателен за ресурсы для ответа. У меня нет временных рамок для работы, поэтому я надеюсь кое-что узнать здесь.

1 ответ

Ты можешь использовать numpy.genfromtxt() который принимает генератор и, следовательно, допускает некоторую настройку ввода, который вы даете. Например, здесь я заменяю D от e и игнорируя все строки, начинающиеся с 'M' а также 'C', Кроме того, я использую только столбцы (3, 5, 7), которые содержат нужные данные. Наконец, массив изменяется, чтобы сохранить каждый "импульс" отделенным друг от друга и доступным через первый индекс (при условии, что они всегда будут иметь 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
Другие вопросы по тегам