簡體   English   中英

如何計算python中的質心

[英]How to Calculate Centroid in python

我是python編碼的初學者。 我正在研究結構坐標。 我有pdb結構,它有xyz坐標信息(最后三個col)

ATOM      1  N   SER A   1      27.130   7.770  34.390    
ATOM      2  1H  SER A   1      27.990   7.760  34.930     
ATOM      3  2H  SER A   1      27.160   6.960  33.790    
ATOM      4  3H  SER A   1      27.170   8.580  33.790    
ATOM      5  CA  SER A   1      25.940   7.780  35.250    
ATOM      6  CB  SER A   1      25.980   9.090  36.020    
ATOM      7  OG  SER A   1      26.740  10.100  35.320    
ATOM      8  HG  SER A   1      26.750  10.940  35.860    
ATOM      9  C   SER A   1      24.640   7.790  34.460    
ATOM     10  O   SER A   1      24.530   8.510  33.500    
ATOM     11  N   CYS A   2      23.590   7.070  34.760    
ATOM     12  H   CYS A   2      23.590   6.550  35.610    
ATOM     13  CA  CYS A   2      22.420   7.010  33.900    
ATOM     14  CB  CYS A   2      21.620   5.760  34.270    
ATOM     15  SG  CYS A   2      22.480   4.210  33.970    
ATOM     16  C   CYS A   2      21.590   8.220  34.040    
ATOM     17  O   CYS A   2      21.370   8.690  35.160   
  • 我的結構中有1000個原子。
  • 我有兩個問題。

我如何從xyz坐標計算結構的質心。
從質心我想畫一個半徑為20厘米的球體。

I try this


from __future__ import division
import math as mean
import numpy as nx
from string import*


infile = open('file.pdb', 'r')           #open my file
text1 = infile.read().split('\n')
infile.close()

text = []
for i in text1:
if i != '':
    text.append(i)

for j in text:
x1 = eval(replace(j[30:38], ' ', ''))         #extract x-coordinate
y1 = eval(replace(j[38:46], ' ', ''))         #extract y-coordinate
z1 = eval(replace(j[46:54], ' ', ''))         #extract z-coordinate

idcord = []
idcord.append(x1); idcord.append(y1); idcord.append(z1)

centroid = nx.mean(idcord)
print centroid

它給出了每個原子的質心(xyz)我需要一個中心點如何??????

首先,更簡單的方法是使用numpy的genfromtxt函數讀取文件。 您不需要導入字符串,也不需要遍歷所有行並附加文本或計算字符數。

from __future__ import division
import numpy as nx

data = nx.genfromtxt('file.pdb')

然后,最后三列可以訪問為:

data[:, -3:]

第一個:表示“所有行”, -3:表示從倒數第三列到最后一列。

所以,你可以這樣平均:

nx.mean(data[:,-3:], axis=0)

其中axis=0參數告訴nx.mean取第一個( 0th )軸的平均值。 它看起來像這樣:

In : data[:,-3:]
Out: 
array([[ 27.13,   7.77,  34.39],
       [ 27.99,   7.76,  34.93],
       [ 27.16,   6.96,  33.79],
       [ 27.17,   8.58,  33.79],
       [ 25.94,   7.78,  35.25],
       [ 25.98,   9.09,  36.02],
       [ 26.74,  10.1 ,  35.32],
       [ 26.75,  10.94,  35.86],
       [ 24.64,   7.79,  34.46],
       [ 24.53,   8.51,  33.5 ],
       [ 23.59,   7.07,  34.76],
       [ 23.59,   6.55,  35.61],
       [ 22.42,   7.01,  33.9 ],
       [ 21.62,   5.76,  34.27],
       [ 22.48,   4.21,  33.97],
       [ 21.59,   8.22,  34.04],
       [ 21.37,   8.69,  35.16]])

In : np.mean(data[:,-3:], axis=0)
Out: array([ 24.74647059,   7.81117647,  34.64823529])

其他一些事情:

1)刪除此行: import math as mean ,導入整個math模塊並重命名它的mean 您打算from math import meanmath模塊導入mean函數。 但是在你的代碼中,你最終還是使用了numpynx )模塊中的math函數,因此你從未使用過math版本。

2)你的循環沒有縮進,這意味着你要么錯誤地粘貼到StackOverflow中,要么你的循環錯誤縮進。 可能,這就是您的代碼實際上的樣子:

for j in text:
    x1 = eval(replace(j[30:38], ' ', ''))         #extract x-coordinate
    y1 = eval(replace(j[38:46], ' ', ''))         #extract y-coordinate
    z1 = eval(replace(j[46:54], ' ', ''))         #extract z-coordinate

    idcord = []
    idcord.append(x1); idcord.append(y1); idcord.append(z1)

    centroid = nx.mean(idcord)
    print centroid

但問題是, 每次循環通過時, idcord都會設置為空列表,並為每個粒子計算一個新的質心。 如果您如上所述一次導入數據文件,則根本不需要循環。 實際上,您的整個代碼可以是:

from __future__ import division
import numpy as nx

data = nx.genfromtxt('file.pdb')
nx.mean(data[:,-3:], axis=0)

嘗試這個

import numpy as nx
X = nx.rand(10,3)   # generate some number
centroid = nx.mean(X)
print centroid

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM