How to Calculate Centroid in python

后端 未结 2 2038
别跟我提以往
别跟我提以往 2020-12-19 08:32

I\'m beginner to python coding. I\'m working over structural coordinates. I have pdb structure which have xyz coordinate information (last three col)

ATOM          


        
相关标签:
2条回答
  • 2020-12-19 09:04

    try this

    import numpy as nx
    X = nx.rand(10,3)   # generate some number
    centroid = nx.mean(X)
    print centroid
    
    0 讨论(0)
  • 2020-12-19 09:10

    First of all, an easier way to read your file is with numpy's genfromtxt function. You don't need to import string, and you don't need to loop through all the lines and append text or count the characters.

    from __future__ import division
    import numpy as nx
    
    data = nx.genfromtxt('file.pdb')
    

    Then, the last three columns can be accessed as:

    data[:, -3:]
    

    Where the first : means "all rows", and -3: means from the third-to-last column to the last column.

    So, you can average them as such:

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

    where the axis=0 argument tells nx.mean to take the average along the first (0th) axis. It looks like this:

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

    Some other things:

    1) remove this line: import math as mean, which imports the entire math module and renames it mean. What you intended was from math import mean which imports the mean function from the math module. But in your code, you end up using the math function from the numpy (nx) module anyway, so you never used the math version.

    2) your loop is not indented, which means you either pasted incorrectly into StackOverflow, or your loop is incorrectly indented. Possibly, this is what your code actually looks like:

    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
    

    But the problem is that idcord gets set to an empty list every time the loop goes through, and a new centroid is calculated, for each particle. You don't even need the loop at all if you import the data file all at once as above. In fact, your entire code can be:

    from __future__ import division
    import numpy as nx
    
    data = nx.genfromtxt('file.pdb')
    nx.mean(data[:,-3:], axis=0)
    
    0 讨论(0)
提交回复
热议问题