【问题标题】:Iterative calculation for Euclidean distance [duplicate]欧几里得距离的迭代计算
【发布时间】:2020-01-02 12:29:23
【问题描述】:

我是 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。可能是错误的(WHY?

但是,下面的 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)

【问题讨论】:

  • 希望对您有所帮助stackoverflow.com/questions/1401712/…
  • @Paul 我知道如何计算欧几里得距离我想知道多个变量的迭代循环
  • 明确地说,您将所有数据都放在一个文件中?您如何知道哪些行用于 Cu 哪些行用于 O?此外,您的 Cu2 和 O1 看起来非常接近;对吗?

标签: python numpy


【解决方案1】:

以下是一种以最少计算求出元素列表之间的欧几里得距离的方法。 如果您有@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 中的一个元素之间的欧几里得距离。

【讨论】:

    【解决方案2】:

    您可以将列表拆分为 2 个列表,一个包含 Cu 原子,一个包含 O 原子。然后你可以遍历 Cu-list 并计算到 O-list 中每个元素的距离。这可以使用嵌套的 2 个 for 循环轻松完成。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-29
      • 2018-02-14
      • 2013-04-07
      • 2021-01-31
      • 2015-09-23
      • 1970-01-01
      • 2012-12-05
      相关资源
      最近更新 更多