gpt4 book ai didi

python - 欧氏距离的迭代计算

转载 作者:行者123 更新时间:2023-12-01 06:38:21 28 4
gpt4 key购买 nike

我是 python 和 numpy 的新手。我可以生成原子的笛卡尔坐标。例如(CuO)n

我想计算不同种类原子之间的原子间距离(欧几里得距离),例如Cu 到 O 反之亦然。不是 O 到 O 或 Cu 到 Cu。

这是 (CuO)n n=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)

最佳答案

以下是一种以最少计算量查找元素列表之间的欧几里得距离的方法。如果您有 @Jan-Pieter 的答案中提到的两个 CU 和 O 原子列表,您可以使用以下方法找到距离:

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 中的一个元素之间的欧氏距离。

关于python - 欧氏距离的迭代计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59563382/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com