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)
。您正在将浮点列表转换为字符串。这将为您提供列表的字符串表示形式,而不是字符串列表。这不仅没有用,而且也是错误的,因为当你拆分它之后它不会给你预期的结果。
假设i
和j
代表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
我有两种类型的文件: 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)
。您正在将浮点列表转换为字符串。这将为您提供列表的字符串表示形式,而不是字符串列表。这不仅没有用,而且也是错误的,因为当你拆分它之后它不会给你预期的结果。
假设i
和j
代表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