我正在尝试计算由某列标识的两个数据集的平均值.这是AA2栏.简单的解决方案是首先识别数据集,然后计算该数据集的平均值.然而,这在python中看起来并不好看.numpy有没有办法为我做这件事?
我的数据集:
Run Code Online (Sandbox Code Playgroud)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
编辑:我清理了这个例子.均值是在列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)
欢呼,谢谢
您可以使用结构化数组轻松完成,如下所示:
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可用的逻辑功能.
| 归档时间: |
|
| 查看次数: |
228 次 |
| 最近记录: |