欧氏距离的迭代计算

2024-10-06 12:33:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我对python和numpy还不熟悉。 我可以生成原子的笛卡尔坐标。e、 g.(CuO)n

我想计算不同种类的原子之间的原子间距离(欧氏距离),例如Cu到O,反之亦然。不是O对O或Cu对Cu。你知道吗

这是(CuO)nn=2笛卡尔坐标的例子。 (为方便起见,在本问题中添加了(Cu)和(O)符号)

 0.000410140    0.000000000 -1.1437349409 (Cu1)
 0.021984617    0.000000005  0.432069216 (Cu2)
 0.021984488    0.000000005  0.432067361 (O1)
-0.043697492    0.000000005  0.432252977(O2)

随着n尺寸的增大,又产生了两个笛卡尔坐标。你知道吗

所以,我的问题是如何计算迭代欧氏距离,比如Cu1到O1,Cu2到O2,Cu2到O1,Cu2到O2?你知道吗

a = np.loadtxt({file})
for {} in a:
    d = np.sqrt(np.sum((a[int(x)]-a[int(y)]**2))

n=2 x < n y >= n+1 a[0] to a[3], and a[1] to a[4]

我可以看出我在for循环中分配多个变量的弱点。你知道吗

试用版1

a = np.loadtxt({data})
cation = a[:{n}]
anion = a[{n}:]

d = np.sqrt(np.sum((cation-anion)**2))
print(d)

该值为1.5809706852417704。按一下就错了(为什么?

但是,下面的for循环给出了所有值, 1.5759499815439955、1.5766050227405235、1.859480034843622e-06、0.0656823660565985

for x in cation:
    for y in anion:
        d = np.sqrt(np.sum((x-y)**2))
    print (d)

Tags: in距离fornpsqrtsum原子o2
2条回答

下面是一种以最小计算量求元素列表之间欧氏距离的方法。 如果你有两个CU和O原子的列表,如@Jan Pieter的答案中所述,你可以使用以下公式来计算距离:

for atom1 in CUlist:
    print(np.linalg.norm(Olist - atom1, axis=1))

或者你可以用列表理解

distance_matrix=[np.linalg.norm(Olist - atom1, axis=1) for atom1 in CUlist]

它所做的是,它计算整个Olist元素数组与每个迭代中来自CUlist的一个元素之间的欧氏距离。你知道吗

你可以把这个列表分成两个列表,一个是Cu原子,一个是O原子。然后可以循环遍历Cu列表并计算到O列表中每个元素的距离。使用2个for循环可以很容易地完成这一点。你知道吗

for atom1 in CUlist:
   for atom2 in Olist:
      calculatedist(atom1, atom2)

相关问题 更多 >