更好的计算numpy集的方法

tar*_*sch 2 python numpy

我正在尝试计算由某列标识的两个数据集的平均值.这是AA2栏.简单的解决方案是首先识别数据集,然后计算该数据集的平均值.然而,这在python中看起来并不好看.numpy有没有办法为我做这件事?

我的数据集:

   Number       AA1   AA2 AA3   Atom     amou   mean_shift          stddev
   187            ALA GLU LEU   C             1         119.47           0.00
   187            ALA GLU LEU   O             1           8.42           0.00
   188            ALA GLU LYS   C             1         120.67           0.00
   188            ALA GLU LYS   O             1           9.11           0.00
   777            ARG GLN ARG   C             1         117.13           0.00
   777            ARG GLN ARG   O             1           8.48           0.00
Run Code Online (Sandbox Code Playgroud)

我想要的是:

   187             GLU    C             1        (119.47+120.67+117.13)/3 0.00
   187             GLU    O             1          (8.42+9.11+8.48)/3           0.00
Run Code Online (Sandbox Code Playgroud)

编辑:我清理了这个例子.均值是在列mean_shift上计算的,但仅在原子相同的行上计算.我的(不太好的版本)是这样的:

i,j = 0,0
# iterate over all keys
for j in range(1, len(data_one)):
        key = data_two[j][3]
        aminoacid = data_two[j][5]
        print key, aminoacid
        stop
        keyeddata=[]
        for i in range(1, len(data_one)):
                if (data_one[i][2]==key):
                        keyeddata.append(data_one[i])
                print mean(keyeddata[6])
Run Code Online (Sandbox Code Playgroud)

欢呼,谢谢

Ric*_*nes 6

您可以使用结构化数组轻松完成,如下所示:

import numpy as np

# Test data
data = [
   (187, "ALA","GLU", "LEU", "C", 1, 119.47, 0.00),
   (187, "ALA","GLU", "LEU", "O", 1, 8.42, 0.00),
   (188, "ALA","GLU", "LYS", "C", 1, 120.67, 0.00),
   (188, "ALA","GLU", "LYS", "O", 1, 9.11, 0.00),
   (777, "ARG","GLN", "ARG", "C", 1, 117.13, 0.00),
   (777, "ARG","GLN", "ARG", "O", 1, 8.48, 0.00),
   ]

# Structure definition
my_dtype = [
    ('Number',  'i4'),
    (  'AA1',   'a3'),
    (  'AA2',   'a3'),
    (  'AA3',   'a3'),
    ( 'Atom',   'a1'),
    ( 'amou',   'i4'),
    ( 'mean',   'f4'),
    ( 'stddev', 'f4')
           ]

a = np.array(data, dtype = my_dtype)
Run Code Online (Sandbox Code Playgroud)

现在,使用该a数组,您可以轻松提取组.首先,让我们找出某个属性的唯一元素:

>>> np.unique(a['AA2'])
array(['GLN', 'GLU'], 
      dtype='|S3')
Run Code Online (Sandbox Code Playgroud)

现在,您可以通过匹配属性来对数据进行分组.例如:

# This gives you a mask
>>> a['AA2'] == 'GLN'
array([False, False, False, False,  True,  True], dtype=bool)
# that you can apply to the array itself
>>> a[a['AA2'] == 'GLN']
array([(777, 'ARG', 'GLN', 'ARG', 'C', 1, 117.12999725341797, 0.0),
       (777, 'ARG', 'GLN', 'ARG', 'O', 1, 8.4799995422363281, 0.0)], 
      dtype=[('Number', '<i4'), ('AA1', '|S3'), ('AA2', '|S3'), ('AA3', '|S3'),
             ('Atom', '|S1'), ('amou', '<i4'), ('mean', '<f4'), ('stddev', '<f4')])
Run Code Online (Sandbox Code Playgroud)

从那里,您可以将任何计算应用于任意属性.说,意思是:

>>> gln = a[a['AA2'] == 'GLN']
>>> gln['mean'].mean()
62.805000305175781
Run Code Online (Sandbox Code Playgroud)

编辑:现在,要按照多个条件选择数据,请记住上一个a['AA2'] == 'GLN'示例:

>>> a['Atom'] == 'C'
array([ True, False,  True, False,  True, False], dtype=bool)
>>> np.logical_and(a['Atom'] == 'C', a['AA2'] == 'GLN')
array([False, False, False, False,  True, False], dtype=bool)

# Which of course would give us the only row that fits:
>>> a[np.logical_and(a['Atom'] == 'C', a['AA2'] == 'GLN')]
array([(777, 'ARG', 'GLN', 'ARG', 'C', 1, 117.12999725341797, 0.0)], ...)
Run Code Online (Sandbox Code Playgroud)

你可能会想要做的标准的一些组合数学(使用itertools或类似)自动化的过程中,你可能还想看看这里看到与NumPy可用的逻辑功能.