2016-09-07 4 views
0

У меня есть файлы в два типа: A: содержит 1206 строк координат (XYZ) - белок, цепь Б: содержит 114 строк координат (XYZ) - пучок молекулыPython вычислить минимальные расстояния между несколькими координатами

Я хотел бы сделать следующее: Для каждой линии A вычислить расстояние от каждой строки B. Поэтому я получаю 114 значений расстояния для каждой строки A. Но мне не нужны все они, только самые короткие для каждая строка A. Таким образом, желаемый результат: Файл с 1206 строками, каждая строка содержит одно значение: кратчайшее расстояние. Важно, чтобы сохранить первоначальный порядок файла А.

Мой код:

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") 

Этот код работает, но только частично. --- Моя конечная цель найти белковые остатки достаточно близки к этому кучу молекулы (сайт связывания). Я могу проверить свои результаты с помощью визуального программного обеспечения, и мой код найдет гораздо меньше остатков, чем должен. ----

Я просто не могу понять, в чем проблема. Не могли бы вы помочь мне? Спасибо!

+0

я не получил последний вопрос! Вы можете вычислить вектор из 1024 элементов, который содержит ближайший элемент в B для каждой строки в A. Теперь, на следующем шаге, что вы хотите вычислить? Я думаю, если вы добавите пример файла A, а файл B будет приятным. –

+0

Большие данные не означают, что у вас не должно быть небольших данных для фактической проверки вашей реализации. Если единственное, что вам нужно доказать, что ваш алгоритм работает, - это поверхностный визуальный контроль, никто не станет воспринимать это серьезно. – Voo

ответ

1

Ваш код довольно запутанный, и я вижу несколько ошибок.

Вы используете minimum вне цикла for, поэтому записывается только его последнее значение.

Также, как вы вычисляете minimum, это странно. szamok не используется, также нет x (так как вы используете другой x внутри выражения), поэтому и for петли вокруг minimum = ... бесполезны.

Другая подозрительная вещь - str(dist_float). Вы конвертируете список float в строку. Это даст вам строковое представление списка, а не список строк. Мало того, что это бесполезно, это также неправильно, потому что когда вы разделите его после того, как он не даст вам ожидаемого результата.

Предполагая i и j стенды для линий передачи данных А и В, я бы переписать конец кода, как это:

... 
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 

 Смежные вопросы

  • Нет связанных вопросов^_^