计算与外部文件的成对距离

问题描述 投票:0回答:1

我的数据在以下格式的文本文件中:

t  x      y      z
Pb 1.0000 1.5000 2.5000
Pb 1.1000 1.6000 2.6000
S  1.2000 1.4000 2.4000

我希望能够为我拥有的所有坐标计算成对距离,但是以某种方式保留了原子种类的同一性(即,在计算中使用了描述t值的字符串)。我正在使用的成对距离公式只是欧几里得距离矩阵:

r_ij = abs(ri - rj)

ri / rj是3D空间中的坐标。

我可以使用这种方法轻松地找到r_ij的值(并重新格式化数据,使其成为仅包含坐标数据的3xN numpy数组:]

def r_ij_numpy(coords):
r = np.dot(coords, coords.T)
m = np.tile(np.diag(r), (N,1))
r = np.sqrt(m + m.T - 2*r)
r = np.triu(r).ravel()
return r[np.nonzero(r)]

但是我似乎找不到一种用它标记原子类型的方法(即,将输出重构为元组数组,每个元组是r_ij的值,该值附加到两个原子类型的字符串(即'Pb- S')。

谢谢!

python numpy euclidean-distance pairwise-distance
1个回答
0
投票

我将使用cdist计算成对距离,然后将每个对添加到成对字典中,例如。 'Pb-Pb'和'Pb-S'。

import pandas as pd
import numpy as np
from scipy.spatial.distance import cdist
from collections import defaultdict

df = pd.read_csv('atoms.txt', delimiter='\t')
atoms = df['t'].values

loc = df[['x', 'y', 'z']].values

dists = cdist(loc, loc)
dists = np.triu(dists, k=1)

indices = np.column_stack(np.nonzero(dists))

pairs = defaultdict(list)

for i, j in indices:
    pair = f'{atoms[i]}-{atoms[j]}'
    print(f'{pair}, distance: {dists[i, j]}')
    pairs[pair].append(dists[i, j])

>>> Pb-Pb, distance: 0.1732050807568879
    Pb-S, distance: 0.24494897427831783
    Pb-S, distance: 0.30000000000000016

pairs
>>> {'Pb-Pb': [0.1732050807568879],
     'Pb-S': [0.24494897427831783, 0.30000000000000016]}

这样,您可以看到不同化学物质之间的所有原子间距。

© www.soinside.com 2019 - 2024. All rights reserved.