Python 计算多个坐标之间的最小距离

Python calculate minimum distances between multiple coordinates

我有两种类型的文件: A:包含1206条坐标线(xyz)——一条蛋白质链 B:包含114条坐标线(xyz)-一串分子

我想做以下事情: 对于 A 的每一行计算与 B 的每一行的距离。所以我为 A 的每一行得到 114 个距离值。但我不需要所有这些,只需要 A 的每一行的最短距离值。所以所需的输出: 一个文件有 1206 行,每一行包含一个值:最短距离。 重要的是要保持文件 A 的原始顺序。

我的代码:

import os
import sys
import numpy as np



outdir = r'E:\MTA\aminosavak_tavolsag\tavolsagok'
for dirname, dirnames, filenames in os.walk(r'E:\MTA\aminosavak_tavolsag\receptorok'):
    for path, dirs, files in os.walk(r'E:\MTA\aminosavak_tavolsag\kotohely'):
        for filename in filenames:
            for fileok in files:
                if filename == fileok:
                    with open(os.path.join(outdir, filename) , "a+") as f:
                        data_ligand = np.loadtxt(os.path.join(path, fileok))
                        data_rec = np.loadtxt(os.path.join(dirname, filename))

                        for i in data_rec:
                            for j in data_ligand:

                                dist = np.linalg.norm(i - j)

                                dist_float = dist.tolist()  
                                dist_str = str(dist_float)
                                dist_list = dist_str.split()
                                for szamok in dist_list:
                                    for x in range(len(dist_list)):
                                        minimum = min([float(x) for x in dist_list])

                            f.write(str(minimum) + "\r\n")

此代码有效,但仅部分有效。 --- 我的最终目标是找到足够接近这串分子(结合位点)的蛋白质残基。我可以使用可视化软件检查我的结果,我的代码发现的残留物比应有的要少得多。 ----

我只是想不通问题出在哪里。你可以帮帮我吗? 谢谢!

你的代码很混乱,我能看出一些错误。

您在 for 循环之外使用 minimum,因此只写入其最后一个值。

此外,您计算 minimum 的方式很奇怪。 szamok 未使用,x 也未使用(因为您在列表表达式中使用了另一个 x),因此围绕 minimum = ... 的两个 for 循环都是无用的。

另一个可疑的地方是str(dist_float)。您正在将浮点列表转换为字符串。这将为您提供列表的字符串表示形式,而不是字符串列表。这不仅没有用,而且也是错误的,因为当你拆分它之后它不会给你预期的结果。

假设ij代表A和B的数据线,我会这样重写你代码的结尾:

...
data_ligand = np.loadtxt(os.path.join(path, fileok))
data_rec = np.loadtxt(os.path.join(dirname, filename))

for i in data_rec:
    min_dist = min(np.linalg.norm(i - j) for j in data_ligand)
    f.write("{}\r\n".format(min_dist))  # easier than `str(min_dist)` to customize format