Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 用numpy计算集合均值的更好方法_Python_Numpy - Fatal编程技术网

Python 用numpy计算集合均值的更好方法

Python 用numpy计算集合均值的更好方法,python,numpy,Python,Numpy,我试图计算两个数据集的平均值,由某个列标识。这是AA2列。简单的解决方案是首先识别数据集,然后计算该数据集的平均值。然而,这在python中看起来并不好。有没有办法让numpy帮我做这件事 我的数据集: 我想要的是: 编辑: 我澄清了这个例子。平均值通过列mean_shift计算,但仅在原子相同的行上计算。我不太喜欢的版本是: i,j = 0,0 # iterate over all keys for j in range(1, len(data_one)): key = dat

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

我的数据集:

我想要的是:

编辑: 我澄清了这个例子。平均值通过列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])
干杯,
谢谢

您可以使用结构化阵列轻松完成此操作,如下所示:

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)
现在,使用这个数组,您可以轻松地提取组。首先,让我们找出某个属性的唯一元素:

>>> np.unique(a['AA2'])
array(['GLN', 'GLU'], 
      dtype='|S3')
现在,您可以通过匹配属性对数据进行分组。例如:

# 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')])
编辑: 现在,要选择符合多个条件的数据,请记住前面的a['AA2']='GLN'示例:


您可能希望使用itertools或类似工具对标准进行一些组合运算,以使过程自动化,并且您可能还希望查看NumPy中可用的逻辑函数。

您是否签出了Pandas?它是建立在numpy之上的,它有一些非常好的特性来处理标记数据


从你的例子中我不太理解你的问题。如果你说这里的列是AA2,那么前4个条目不应该属于set 1GLU,后两个属于set 2GLN。如果是这样的话,您需要“平均值”列的平均值?我很难将您想要的输出与您的问题联系起来-计算AA2上的平均值如何转换为所有GLN和GLU/LYS行?你能为这个简单的解决方案提供一些伪代码让我明白你的意思吗?干杯。仍然不清楚您想要什么,但在数据集未解析为任何python结构之前,numpy无法对其执行任何操作。你说python中的“不好看”是什么意思?如果您想要可读性好的代码,您可能希望将不必要的内容包装到可重用的类中,以便main中的最终代码看起来干净且可读。这实际上就是我想要的优秀示例的+1。你能添加我如何将掩码扩展到多个列吗?这里不要考虑行/列。这实际上是一个1D阵列!只是每个元素的类型都是一个类似于my_dtype定义的结构。现在,掩码只是一个布尔数组,这意味着您可以使用布尔运算和,或,异或。。。对他们来说。我将更新答案以显示如何更新。
>>> np.unique(a['AA2'])
array(['GLN', 'GLU'], 
      dtype='|S3')
# 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['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)], ...)