Быстрое вычисление тензоров инерции в Python
Мне нужно выполнить очень быстрое вычисление тензоров инерции в Python.
Проблема заключается в следующем:
Позволять xyz
быть Numpy Array формы: (samples, atoms, 3)
который описывает 3
декартовы координаты каждого atoms
в каждом samples
,
atoms
в каждом образце должны быть разбиты на множество молекул. Мне нужен тензор инерции каждой молекулы в каждом образце.
Каждая молекула содержит n
атомы, и они упорядочены таким образом, что они сгруппированы вместе. То есть:
numpy.array( numpy.split(xyz, atoms/n, axis=1).shape )
возвращает массив формы: (количество молекул, образцов, атомов на молекулу, 3), где первый индекс проходит по молекулам.
Заметки:
- Это очень похоже на проблему, решаемую здесь, но они вычисляют тензор инерции всей системы, в то время как мне нужны тензоры инерции ее частей (тензор инерции каждой молекулы в системе).
- Было бы предпочтительно получить массив тензоров инерции.
- Я думаю, что numpy.einsum будет хорошей альтернативой (но мне трудно это реализовать)
- Я могу получить массив атомных масс быстро и без проблем.
- Если это поможет,
samples
имеет размер от 100 до 500 ок., иatoms
примерно до 20 000 (но операция выполняется во многих кусках, которые в общей сложности сделали около 1E5 выборок).