【问题标题】:Python calculate minimum distances between multiple coordinatesPython计算多个坐标之间的最小距离
【发布时间】:2016-09-07 20:31:33
【问题描述】:

我有两种类型的文件: 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")

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

我就是不知道问题出在哪里。你可以帮帮我吗? 谢谢!

【问题讨论】:

  • 我没有得到最后一个问题!您可以计算 1024 个元素的向量,其中包含 A 中每一行的 B 中最近的元素。现在,在下一步中,您要计算什么?我想,如果你添加一个文件 A 和文件 B 的示例会很好。
  • 大数据并不意味着您不应该使用小数据来实际测试您的实现。如果你唯一需要证明你的算法有效的事情就是一些肤浅的视觉检查,那么没有人会认真对待。

标签: python coordinates distance bioinformatics


【解决方案1】:

您的代码非常混乱,我可以看到一些错误。

您在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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-12
    • 2010-09-26
    • 2018-06-12
    • 1970-01-01
    • 2017-11-28
    • 1970-01-01
    • 1970-01-01
    • 2021-09-08
    相关资源
    最近更新 更多