用numpy计算集合平均值的一种好方法

2024-06-01 06:42:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图计算由某一列标识的两个数据集的平均值。这里是AA2列。简单的解决方案是首先识别数据集,然后计算该数据集的平均值。然而,在python中这看起来不太好。有没有办法让纽比帮我?在

我的数据集:

   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

我想要的:

   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

编辑: 我澄清了这个例子。平均值是在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])

干杯, 谢谢


Tags: 数据keydatashiftargmeanone平均值
2条回答

使用结构化阵列可以很容易地做到这一点,例如:

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)

现在,有了这个a数组,您可以轻松地提取组。首先,让我们找出某个属性的唯一元素:

^{pr2}$

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

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

从那里可以对任意属性应用任何计算。例如,平均数:

>>> gln = a[a['AA2'] == 'GLN']
>>> gln['mean'].mean()
62.805000305175781

编辑: 现在,要选择符合多个条件的数据,请记住前面的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)], ...)

您可能需要对标准进行一些组合运算(使用itertools或类似的方法)来自动执行该过程,并且您可能还希望查看一下here以查看NumPy中可用的逻辑函数。在

你检查过熊猫吗?它是建立在numpy之上的,它有一些非常好的特性来处理标记数据。在

http://pandas.sourceforge.net/

相关问题 更多 >